外观模式
1、什么是外观模式2、为何使用外观模式
3、何时何种场景需要使用外观模式
4、最小知识原则
例子:
public class Car
{
Engine engine;
// 其他实例变量
public Car()
{
// 初始化引擎等
}
public void start(Key key)
{
Doors doors = new Doors();
boolean authorized = key.turns();
if (authorized) {
engine.start();
updateDashboardDisplay();
doors.lock();
}
}
public void updateDashboardDisplay()
{
// 更新显示
}
}//当前对象本身
updateDashboardDisplay();
//当前方法的参数: key
public void start(Key key) {
//...
boolean authorized = key.turns();
//...
}
//当前对象所创建的对象doors
Doors doors = new Doors();
//对象的任何组件: 当前对象的成员对象 engine
Engine engine;
5、模式对比
6、工作中的例子
重构了企业数据同步相关代码, 采用外观模式, 调用方只需要与DataSyncFacade类进行交互进行数据同步推送,无需与多个类产生交互
public class DataSyncFacade
{
private List ProcessorList { get; }
public DataSyncFacade(DataSyncTypeEnum typeEnum, string rowKey, BusinessUnitsSaveSyncOperationTypeEnum operationType,
BusinessUnitsSaveSyncSceneTypeEnum sceneType, string operationNote, List forceUpdateFields = null)
{
if (string.IsNullOrWhiteSpace(rowKey))
{
return;
}
BusinessUnitsSaveSyncDTO syncInfo = new BusinessUnitsSaveSyncDTO
{
RowKey = rowKey,
OperationType = operationType,
SceneType = sceneType,
OperationNote = operationNote,
ForceUpdateFields = forceUpdateFields
};
List processorList = new List();
if (typeEnum.HasFlag(DataSyncTypeEnum.BusinessUnitsSaveMasterDataSync))
{
ISyncProcessor processor = new BusinessUnitsSaveMasterDataSyncProcessor(syncInfo);
processorList.Add(processor);
}
if (typeEnum.HasFlag(DataSyncTypeEnum.BusinessUnitsSaveEventSync))
{
ISyncProcessor processor = new BusinessUnitsSaveEventSyncProcessor(syncInfo);
processorList.Add(processor);
}
if (typeEnum.HasFlag(DataSyncTypeEnum.BusinessUnitsUpdateEventSync))
{
ISyncProcessor processor = new BusinessUnitsUpdateEventSyncProcessor(syncInfo);
processorList.Add(processor);
}
if (typeEnum.HasFlag(DataSyncTypeEnum.StationCreditFlagUpdateSync))
{
ISyncProcessor processor = new StationCreditFlagUpdateSyncProcessor(syncInfo);
processorList.Add(processor);
}
ProcessorList = processorList;
}
public void Execute()
{
if (ProcessorList.IsNullOrEmpty())
{
return;
}
foreach (ISyncProcessor processor in ProcessorList)
{
if (processor == null)
{
continue;
}
processor.Sync();
}
}调用方重构前:
public class BusUnitOperatorService : IBusUnitOperatorService
{
public string UpdateBusUnitOperator(OperatorObject OperatorUnit)
{
//do something...
SdkBusiness sdk = new SdkBusiness();
sdk.ExcuteBaseUnitForSdk(OperatorUnit.ID, "2", "修改运营商");
BusUnitBLL busUnit = new BusUnitBLL();
busUnit.BusinessUnitsUpdateSend(operatorobj.ID);
BusUnitCommon.UpdateStaZhima(OperatorUnit.ID, OperatorUnit.IfZhimaCredit, OperatorUnit.IfWeiXinCredit, OperatorUnit.OperatorLastModifier);
//do something...
}
}调用方重构后:
public class BusUnitOperatorService : IBusUnitOperatorService
{
public string UpdateBusUnitOperator(OperatorObject OperatorUnit)
{
//do something...
DataSyncFacade dataSync = new DataSyncFacade
(
DataSyncTypeEnum.BusinessUnitsSaveMasterDataSync
| DataSyncTypeEnum.BusinessUnitsSaveEventSync
| DataSyncTypeEnum.BusinessUnitsUpdateEventSync
| DataSyncTypeEnum.StationCreditFlagUpdateSync,
OperatorUnit.ID,
BusinessUnitsSaveSyncOperationTypeEnum.Update,
BusinessUnitsSaveSyncSceneTypeEnum.Operator,
"修改运营商"
);
dataSync.Execute();
//do something...
}
}