deligation

委派机制。

参考链接:https://blog.csdn.net/Seriousplus/article/details/80462722

  1. 依赖: use a

  2. 关联:has a

  3. 组合 Composition:a part of,一个对象包含另一个对象。直接在该类中实例化一个其他类。

  • 在组合中,当拥有的对象被销毁时,所包含的对象也是如此
public class WebServer { private HttpListener listener; private RequestProcessor processor; public WebServer() { this.listener = new HttpListener(80); this.processor = new RequestProcessor(“/www/root”);}
}
  1. 聚集 Aggregation:对象在外部创建。作为一个参数传递给构造函数。
public class WebServer { private HttpListener listener; private RequestProcessor processor; public WebServer(HttpListener listener, RequestProcessor processor) {this.listener = listener;this.processor = processor;}
}

适配器模式Adaptor

将某个类/接口转换为client期望的其他形式。通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。

例子

装饰器模式 Decorator

客户端需要一个具有多种特性的object,通过一层一层的装饰来实现。

为对象增加不同侧面的特性。对每一个特性构造子类,通过委派机制增加到对象上。

例子

interface Stack {void push(Item e);Item pop();
}
public abstract class StackDecorator implements Stack {protected final Stack stack;public StackDecorator(Stack stack) {this.stack = stack;}public void push(Item e) {stack.push(e);}public Item pop() {return stack.pop();}...
}
public class UndoStack extends StackDecorator implements Stack {private final UndoLog log = new UndoLog();public UndoStack(Stack stack) {super(stack);}public void push(Item e) {log.append(UndoLog.PUSH, e);super.push(e);}public void undo() {//implement decorator behaviors on stack}...
}

与继承比较

  1. 功能组合
  • decorator是在运行时组合功能特性的
  • 继承是在编译时组合功能特性的
  1. 对象
  • decorator是多个对象通过delegation协作完成的

  • 继承是单个有清晰特性的对象

  1. 多重继承
  • decorator可以混合搭配多种decoration
  • 多重继承概念上讲是困难的

Facade 外观模式

客户端需要通过一个简化的接口来访问复杂系统内的功能

  • 提供一个统一的接口来取代一系列小接口调用,相当于对复杂系统做了一个封装,简化客户端使用。

  • 便于客户端学习使用,解耦

public class MySqlHelper {public static Connection getMySqlDBConnection() {…}public void generateMySqlPDFReport(String tableName, Connection con){…}public void generateMySqlHTMLReport(String tableName, Connection con){…}
}public class OracleHelper {public static Connection getOracleDBConnection() {…}public void generateOraclePDFReport(String tableName, Connection con){…}public void generateOracleHTMLReport(String tableName, Connection con){…}
}

使用外观模式

public class HelperFacade {public static void generateReport(DBTypes dbType, ReportTypes reportType, String tableName){Connection con = null;switch (dbType){case MYSQL:con = MySqlHelper.getMySqlDBConnection();MySqlHelper mySqlHelper = new MySqlHelper();switch(reportType){case HTML:mySqlHelper.generateMySqlHTMLReport(tableName, con);break;case PDF:mySqlHelper.generateMySqlPDFReport(tableName, con);break;}break;case ORACLE: …}public static enum DBTypes { MYSQL,ORACLE; }public static enum ReportTypes { HTML,PDF;}
}

例子

(设计模式)Adaptor、Decorator与Facade模式相关推荐

  1. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  2. 设计模式之九 --- 外观(Facade)模式

    [1]基本概念 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. [2]简单分析 我们先来看下该设计模式的UML结构图: ...

  3. 从操作系统内核看设计模式--linux内核的facade模式

    linux的内核当中处处充满了设计模式,本文先讨论一下外观模式.外观模式就是将客户和子系统解耦,为客户将复杂的子系统进行封装,从而使得客户可以使用简单易用的接口.   众所周知,linux和unix是 ...

  4. 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)

    结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...

  5. Java设计模式 -11- 外观模式(Facade模式)

    Java设计模式 -11- 外观模式(Facade模式) 前言 外观模式的定义与特点 优点: 缺点: 外观模式的结构与实现 1. 模式的结构 2. 模式的实现 外观模式的应用实例 外观模式的应用场景 ...

  6. 设计模式--门面(Facade)模式

    模式定义 为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用(复用) 类图 应用场景 1.当你需要使用复杂子系统的有限但直接的接口时 ...

  7. facade java_Java设计模式之Facade模式

    Java设计模式之Facade模式  GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易 ...

  8. 结构型设计模式(2)—— 外观模式(Facade Pattern)

    文章目录 1.概述 2.外观模式的简单应用 3.应用场景 4.优缺点 5.小结 参考文献 1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.外观模式(Facade Pattern)属于 ...

  9. 重学设计模式 - Facade模式

    1.     Facade模式简介 Façade在建筑领域的意思是:(掩饰真相的)门面,也就意味着,如果你想探究更细节的真相就需要经过Façade. <设计模式>一书中对Façade模式的 ...

最新文章

  1. 《计算机基础(2008版)》第4次作业,计算机基础第4次作业.doc
  2. Application与线程同步
  3. 字典删除多个键值对方法_Life is short,you need Python——Python序列(元组、字典、集合)...
  4. error while loading shared libraries的解決方法
  5. 数字语音信号处理学习笔记——语音信号的短时时域分析(3)
  6. 通过路由进行参数的传递(方法一)
  7. Linux 配置jdk
  8. 深度优先搜索c语言详解,深度优先搜索 — C语言版
  9. 川大计算机文化基础在线作业,川大1309《计算机文化基础0008》在线作业2答案.docx...
  10. mysql中char与varchar的区别分析
  11. mac上的命令行工具
  12. solr php大小写,Solr 学习(6) —- Solr的PHP客户端
  13. PostgreSQL中定时job执行(pgAgent)
  14. 《android基于andFix的热修复方案》思路篇
  15. 病毒传播数学建模matlab分析,数学建模MATLAB之分析法(一)
  16. 【转】JavaScript生成GUID的算法
  17. python列表用什么符号表示_python列表类型
  18. 开机连接WiFi显示无Internet连接但能上网且弹出“MSN中国”网页
  19. Java IO和NIO的区别
  20. 使用DataV制作实时销售数据可视化大屏

热门文章

  1. 人工智能(Machine Learning)—— 机器学习
  2. opencv python图片合成视频
  3. css清除浮动的四种方法(详细)
  4. 抵御风险网站防攻击,国产浏览器能做的有很多
  5. 各种语言的特点和介绍
  6. 1120_野火RT-Thread教程学习4_RTT学习基础知识梳理
  7. Python 学习入门(1)—— PyDev
  8. 【解决方案 二十六】DateGrip一键生成DML语句用于上线
  9. 成长为 iOS 大 V 的秘密
  10. c# Thumbnail 生成缩略图,生成压缩图,最大宽高比例缩放,最大边按比例缩放