理解设计模式之装饰器模式
来源:互联网 发布:oracle .sql如们运行 编辑:程序博客网 时间:2024/04/29 23:36
概述
向一个现有的对象添加新的功能,同时又不改变其结构。
设计原则
对扩展开发,修改关闭。
简要说明
装饰者模式是对现有对象进行装饰,通过装饰,我们的对象对同一种行为可以产生不同的效果,或者说通过装饰后,我们的对象通过调用同一种方法,能够实现在不影响原有功能的基础上增加新的功能。
关系图
从关系图可以看出具体类和装饰类都有一个相同的超类,而这个超类就是他们的联系(具有相同的方法)。装饰类,其实仅仅是给具体类加上的一些新东西,他们本质上还是同一种类型(拥有同一个超类)。
使用场景
扩展一个类的功能,并且可以保留已有的功能,通过继承可以实现,不利于我们的扩展,如果以后需要继续新增,我们只能采用多重继承,如果在想改变某一种功能,这时会导致后面所有的功能发生改变。因此装饰者模式利用了组合方式实现。
举例说明
现在有个APP的登录功能,我们需要在登录的时候根据需要选择登录QQ和微博(已经通过授权)。
//同一个行为接口public interface IBehavior{ void login();}//被装饰类public class App implements IBehavior{ public void login(){ System.out.println("登录APP自身系统"); }}//装饰抽象类public abstract class Decorator implements IBehavior{ private App app; public Decorator(App app){ this.app = app; } public void login(){ app.login(); }}//具体装饰类01public class Decorator_01 extends Decorator{ public Decorator_01(App app){ super(app); } @Override public void login(){ super.login(); System.out.println("新增登录QQ的功能"); }}//具体装饰类02public class Decorator_02 extends Decorator{ public Decorator_02(App app){ super(app); } @Override public void login(){ super.login(); System.out.println("新增登录微博的功能"); }}//测试类public class Test{ public static void main(String[] args){ //没有任何修饰 IBehavior app = new App(); app.login(); System.out.println("-----------"); //添加一个QQ登录的功能,保留原App登录 Decorator d1 = new Decorator_01(app); d1.login(); System.out.println("-----------"); //添加一个微博登录的功能,保留QQ登录和原App登录 Decorator d2 = new Decorator_02(d1); d2.login(); }}//输出登录APP自身系统-------------登录APP自身系统新增登录QQ的功能-------------登录APP自身系统新增登录QQ的功能新增登录微博的功能
阅读全文
0 0
- 理解设计模式之装饰器模式
- 设计模式之装饰器
- 设计模式之装饰器
- 设计模式之装饰器
- GOF23设计模式之装饰模式之理解
- 设计模式之-Decorator--装饰器模式
- 设计模式之装饰器模式
- 设计模式之三:装饰器模式
- 设计模式之: Decorator(装饰器)模式
- Java设计模式之装饰器模式
- 设计模式之装饰器模式
- 设计模式之十三:装饰器模式
- 设计模式之装饰器模式
- 设计模式 之 装饰器模式
- 设计模式之装饰器模式
- 设计模式之装饰器模式
- java设计模式之装饰器模式
- 设计模式之装饰器模式
- jQuery 表格展开关闭
- Code[vs]1187 Xor最大路径
- java冒泡排序算法
- Improving Deep Neural Network with Multiple Parametric Exponential Linear Units(MPELU译文)
- 枚举写法模板
- 理解设计模式之装饰器模式
- 趟过的那些坑-listview addfootview点击
- 最大质因数
- python -- 教室调度问题
- Boostnote是什么?-是为程序员开发的一种开放源代码记事本
- C/C++ << 左移运算符,. >>右移运算符
- cocos2d-js 分享截屏-js代码
- Fastjson
- Android 使用RenderScript 实现毛玻璃(模糊)