【读书活动感悟分享】极客充电队——《Head First 设计模式》外观模式读书心得_文章

【读书活动感悟分享】极客充电队——《Head First 设计模式》外观模式读书心得

王海帆
发表于 2025-11-09 22:59:24

外观模式

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...
    }
 }





102 0

评论


意见反馈