JAVA开发的23种设计模式之 — 装饰器模式 代理器模式
- 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活
- 维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 :增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数.装饰类实现新的功能,但是,在不需要用到新功能的地方,他可以直接调用原来的类中的方法.修饰类必须和原来的类有相同的接口.
- 使用场景
- 想要向一个现有的对象添加新的功能,同是又不改变其结构.这样可以在不增加子类的情况下扩展类
- 动态增加功能,动态撤销.
- 优点
- 装饰类和被装饰类可以独立发展,不会相互耦合.
- 装饰模式是继承的一个替代模式,但是他提供了比继承更多的灵活性.
- 装饰模式可以动态的方式扩展一个实现类的功能.在运行时选择不同的装饰器,从而实现不同的行为.
- 缺点
- 多层装饰比较复杂
- 做法 : 在装饰器类中添加一个被装饰类的实例,然后增加需要的功能并调用被装饰的类的方法.
- 类图
package Decorator;/*** Created by looper on 2017/8/16.*/
public interface Painting {public void show();
}
蒙娜丽莎(MonaLisa类)
package Decorator;/*** Created by looper on 2017/8/16.*/
public class MonaLisa implements Painting {@Overridepublic void show() {System.out.println("这是一副蒙娜丽莎的微笑");}
}
装饰器类
package Decorator;/*** Created by looper on 2017/8/16.*/
public class Decorator implements Painting {private Painting painting;public Decorator(Painting monaLisa){this.painting = monaLisa;}@Overridepublic void show() {System.out.println("先加上相框");painting.show();System.out.println("再扣上玻璃");}
}
测试类
package Decorator;/*** Created by looper on 2017/8/16.*/
public class DecoratorTest {public static void main(String[] args) {Painting painting = new MonaLisa();Painting monaLisa = new Decorator(painting);monaLisa.show();}
}
- 概念:为其它对象提供一种代理以控制对这个对象的访问.
- 组成
- 抽象角色:通过接口或抽象类声明真实角色实现的业务方法.
- 代理角色:实现抽象角色,是真实角色的代理.通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作.
- 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用.
- 优点
- 职责清晰,真实角色就是实现实际的业务逻辑,不用担心其它非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简介清晰.
- 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用.
- 高扩展性
- 缺点
- 犹豫在客户端和真实角色之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢.
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂.
package Proxy;/*** Created by looper on 2017/8/16.*/
public interface Home {public void selectHome();
}
客户类
package Proxy;/*** Created by looper on 2017/8/16.*/
public class Custom implements Home {@Overridepublic void selectHome() {System.out.println("选择房子!!!");}
}
中介类
package Proxy;/*** Created by looper on 2017/8/16.*/
public class Intermediary implements Home {private Custom custom;public Intermediary(){this.custom = new Custom();}@Overridepublic void selectHome() {before();custom.selectHome();after();}private void before(){System.out.println("中介找房源");}private void after(){System.out.println("签合同");}
}
测试类
package Proxy;/*** Created by looper on 2017/8/16.*/
public class ProxyTest {public static void main(String[] args) {Home home = new Intermediary();home.selectHome();}
}
- 装饰器类和被装饰类实现同一个接口.
- 装饰器类关注于在一个对象上动态的添加方法.
- 强调:增强方法
- 代理类和真实处理类实现同一个接口.
- 代理模式关注于控制对对象的访问,代理类通过代理模式向访问他的客户隐藏了真实调用的对象.
- 强调:增强
我将23种设计模式的全部代码上传到CSDN,有用得到的同学 可以去下载.
下载地址 : 点我
JAVA开发的23种设计模式之 — 装饰器模式 代理器模式相关推荐
- java GoF 的 23 种设计模式的分类和功能
摘抄:http://c.biancheng.net/view/1320.html 1.什么是GoF(摘抄自百度词条) <Design Patterns: Elements of Reusable ...
- 23种设计模式介绍(一)---- 创建型模式
由于设计模式篇幅比较大,如果在一篇文章讲完所有的设计模式的话不利于阅读.于是我把它分为三篇文章 23种设计模式介绍(一)---- 创建型模式 23种设计模式介绍(二)---- 结构型模式 23种设计模 ...
- Java内功修炼 - 23种设计模式
一个设计模式的出现一定有它特殊的价值 前段时间二刷Java设计模式 对于设计模式来说,这个东西是始终不变的,所以我把这方面知识归纳为Java内功. 一个技术超牛的程序员,也就和修仙类小说男主角一样.不 ...
- 软件开发除了23种设计模式,还有7个开发原则需要了解
摘要:使用设计模式能够使我们开发的程序,易维护.可拓展,可复用.但是在23个设计模式的背后,还有7个开发原则去支撑着设计模式,保证23个设计模式能够易维护.可拓展,可复用.所以这篇文章来解开七大设计原 ...
- 23种设计模式(二十二)状态模式(阁瑞钛伦特软件-九耶实训)
常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...
- Java中的23种设计模式
java中的23中设计模式 1.工厂模式:客户类和工厂类分开.消费者任何时候需要某种产品,只需向工厂请求即可.消费者无须修改就可以接纳新产品.缺点是当产品修改时,工厂类也要做相应的修改.如:如何创建及 ...
- 一文弄懂23种设计模式之装饰器模式
前言 装饰器模式 Reference [1] bugstack.cn/md/develop/- [2] c.biancheng.net/view/1397.h- [3] refactoringguru ...
- 软件开发的 23种设计模式
目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Singlet ...
- 23种设计模式:(二)结构型模式
根据北京尚学堂的视频所学习 结构型模式: 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式.代理模式.桥接模式. 装饰模式.组合模式.外观模式. ...
最新文章
- matlab函数 size()函数和waterfal()l函数,三维图形,矩阵
- 从HarmonyOS应用到底是不是Android套壳?
- 分割 bisenetv2笔记
- C++基础-string截取、替换、查找子串函数
- 像个字段相减绝对值_【高考数学】33个知识点+66个易混点大整合
- JavaFX 2.0示例介绍书
- Wincc V7.3SE安装截图
- 非web项目并且项目文件多java项目 使用tomcat发布的方式
- 2021小程序该怎么做?爆款产品拆解案例来了
- 电脑字体在哪个文件夹_在PS里如何安装字体
- struct interface_golang 避坑指南(1)interface 之坑多多 | 文末深圳 Meetup
- deeplung代码实现测试是卡住情况说明
- java poi读取excel日期格式数据
- 校园网自动登录(校园翼行网)
- python定时任务_Python定时任务工具--APScheduler
- pyltp实体识别_命名实体识别,使用pyltp提取文本中的地址
- 亚马逊查询订单listorders方法
- HTML学习笔记(2)
- 如何快速查询SCI期刊JCR和ISO缩写?
- 谷粒商城-基础篇-环境搭建(P1-P44)
热门文章
- AI新药研发工具:deepchem
- java abort_在7.0以上版本的手机系统上出现java.lang.Exception: ... abort cold fix异常
- java多态 降低代码耦合性_如何降低耦合度
- python使用selenium 打开谷歌浏览器闪退, 怎么解决
- 大数据信息资料采集:美国财富500强企业信息资料采集爬取
- Pascal's Triangle (LeetCode) 帕斯卡三角或者叫杨辉三角----动态规划和memoization
- 孤军大作战!疯狂DIY 1U硬件防火墙实录(一)
- 异步编程中的BeginInvoke和EndInvoke
- idea创建module项目
- matlab如何输出总位移,加速度转换成位移的matlab代码及说明