(设计模式)Adaptor、Decorator与Facade模式
deligation
委派机制。
参考链接:https://blog.csdn.net/Seriousplus/article/details/80462722
依赖: use a
关联:has a
组合 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”);}
}
- 聚集 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}...
}
与继承比较
- 功能组合
- decorator是在运行时组合功能特性的
- 继承是在编译时组合功能特性的
- 对象
decorator是多个对象通过delegation协作完成的
继承是单个有清晰特性的对象
- 多重继承
- 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模式相关推荐
- 设计模式学习笔记——外观(Facade)模式
设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...
- 设计模式之九 --- 外观(Facade)模式
[1]基本概念 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. [2]简单分析 我们先来看下该设计模式的UML结构图: ...
- 从操作系统内核看设计模式--linux内核的facade模式
linux的内核当中处处充满了设计模式,本文先讨论一下外观模式.外观模式就是将客户和子系统解耦,为客户将复杂的子系统进行封装,从而使得客户可以使用简单易用的接口. 众所周知,linux和unix是 ...
- 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)
结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...
- Java设计模式 -11- 外观模式(Facade模式)
Java设计模式 -11- 外观模式(Facade模式) 前言 外观模式的定义与特点 优点: 缺点: 外观模式的结构与实现 1. 模式的结构 2. 模式的实现 外观模式的应用实例 外观模式的应用场景 ...
- 设计模式--门面(Facade)模式
模式定义 为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用(复用) 类图 应用场景 1.当你需要使用复杂子系统的有限但直接的接口时 ...
- facade java_Java设计模式之Facade模式
Java设计模式之Facade模式 GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易 ...
- 结构型设计模式(2)—— 外观模式(Facade Pattern)
文章目录 1.概述 2.外观模式的简单应用 3.应用场景 4.优缺点 5.小结 参考文献 1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.外观模式(Facade Pattern)属于 ...
- 重学设计模式 - Facade模式
1. Facade模式简介 Façade在建筑领域的意思是:(掩饰真相的)门面,也就意味着,如果你想探究更细节的真相就需要经过Façade. <设计模式>一书中对Façade模式的 ...
最新文章
- 《计算机基础(2008版)》第4次作业,计算机基础第4次作业.doc
- Application与线程同步
- 字典删除多个键值对方法_Life is short,you need Python——Python序列(元组、字典、集合)...
- error while loading shared libraries的解決方法
- 数字语音信号处理学习笔记——语音信号的短时时域分析(3)
- 通过路由进行参数的传递(方法一)
- Linux 配置jdk
- 深度优先搜索c语言详解,深度优先搜索 — C语言版
- 川大计算机文化基础在线作业,川大1309《计算机文化基础0008》在线作业2答案.docx...
- mysql中char与varchar的区别分析
- mac上的命令行工具
- solr php大小写,Solr 学习(6) —- Solr的PHP客户端
- PostgreSQL中定时job执行(pgAgent)
- 《android基于andFix的热修复方案》思路篇
- 病毒传播数学建模matlab分析,数学建模MATLAB之分析法(一)
- 【转】JavaScript生成GUID的算法
- python列表用什么符号表示_python列表类型
- 开机连接WiFi显示无Internet连接但能上网且弹出“MSN中国”网页
- Java IO和NIO的区别
- 使用DataV制作实时销售数据可视化大屏