Skip to content

Files

Latest commit

cec87e0 · Apr 16, 2021

History

History

design

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Aug 22, 2019
Aug 22, 2019
Nov 19, 2019
Aug 22, 2019
Aug 22, 2019
Aug 22, 2019
Feb 27, 2020
Aug 22, 2019
Apr 16, 2021
Aug 22, 2019
Aug 22, 2019
Apr 30, 2020
Apr 30, 2020

README.md

用Go实现常用设计模式

1. 策略模式 (strategy)

意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

关键代码: 实现同一个接口

应用实例:

  1. 主题的更换,每个主题都是一种策略
  2. 旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
  3. JAVA AWT 中的 LayoutManager。

2. 装饰器模式 (decorator)

意图: 装饰器模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

关键代码: 装饰器和被装饰对象实现同一个接口,装饰器中使用了被装饰对象

应用实例:

  1. JAVA中的IO流
new DataInputStream(new FileInputStream("test.txt"));
  1. 人穿衣服,人则为被装饰对象,衣服为装饰器

3. 适配器模式 (adaptor)

适配器适合用于解决新旧系统(或新旧接口)之间的兼容问题,而不建议在一开始就直接使用

意图: 适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间

关键代码: 适配器中持有旧接口对象,并实现新接口

应用实例:

  1. 充电器转接口头
  2. 安卓的ListView
ListView lv=(ListView) findViewById(R.id.lv);
String []data ={"hi","nihao","yes","no"};
ArrayAdapter<String> adapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,data);
lv.setAdapter(adapter);

4. 单例 (singleton)

意图: 使程序运行期间只存在一个实例对象

5. 观察者模式 (observer)

意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

关键代码: 被观察者持有了集合存放观察者(收通知的为观察者)

应用实例:

  1. 报纸订阅,报社为被观察者,订阅的人为观察者
  2. MVC模式,当model改变时,View视图会自动改变,model为被观察者,View为观察者

6. 工厂模式 (factory)

意图: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行 主要解决接口选择问题

关键代码: 返回的实例都实现同一接口

应用实例:

  1. 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
  2. Hibernate 换数据库只需换方言和驱动就可以。

7. 模版方法 (template)

意图: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

关键代码: 通用步骤在抽象类中实现,变化的步骤在具体的子类中实现

应用实例:

  1. 做饭,打开煤气,开火,(做饭), 关火,关闭煤气。除了做饭其他步骤都是相同的,抽到抽象类中实现
  2. spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session

8. 外观模式 (facade)

意图: 提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

关键代码: 外观层中依次调用子系统的接口

应用实例:

  1. 电脑开机时,点击开机按钮,但同时启动了CPU,内存,硬盘等
  2. 用 Java 开发我们经常使用三层结构:controller 控制器层,service 服务层,dao 数据访问层

9. 代理模式 (proxy)

意图: 代理模式为另一个对象提供一个替身或者占位符以控制对这个对象的访问

关键代码: 代理类和被代理类实现同一接口,代理类中持有被代理类对象

应用实例:

  1. 火车票的代理售票点。代售点就是代理,它拥有被代理对象的部分功能—售票功能
  2. 明星的经纪人,经纪人就是代理,负责为明星处理一些事务。

10. 责任链模式 (chain)

意图: 为某个请求创建一个对象链,每个对象依次检查此请求,并对其进行处理,或者将它传给链中的下一个对象

关键代码: 责任链中每个对象都拥有同一个父类(或接口)

应用实例:

  1. 消息过滤器,权限拦截器
  2. 用户发帖内容进行广告过滤,涉黄过滤,敏感词过滤等

11. 功能选项模式(options)

扩展的构造函数和其他公共API中的可选参数

关键代码

  1. 定义一个Option接口,拥有一个设置参数的函数
  2. 定义一个optFunc实现Option接口
  3. 构造结构体时,接收可变类型的Option
  4. 遍历options,调用option中的设置参数方法

12. 工人列队模式(worker)

自定义工人数量,高性能处理任务