博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
回顾装饰模式
阅读量:5217 次
发布时间:2019-06-14

本文共 1446 字,大约阅读时间需要 4 分钟。

最近面试经常被问到这两种设计模式的区别,小编觉得也没什么可比较的地方。额……可能是站的角度不一样吧,那就来比较一下。

说到装饰模式,首先想到的是牛奶加糖加奶的故事。使用装饰模式,可以灵活的解决不同客户的多种附加需求。比如:只加糖、只加奶、又加糖又加奶。
而代理模式,你应该会想到动态代理之类的,是代理对象的行为。

那么装饰模式如何实现动态添加类的职责呢?

概括来说,就是通过继承。来看一下类图:

1、ConcreteComponent被装饰者和Decorator装饰者同时实现(继承)Component接口(抽象类)。

2、并且,Decorator中持有Component的引用。

3、Decorator的两个子类,具体装饰者分别有不同的装饰作用,比如加糖、加奶。

这里写图片描述

下面是代码中的体现:

public abstract class Component {
abstract void test();}//被装饰对象public class ConcreteComponent extends Component {
public void test(){ System.out.println("Compont的原有方法"); }}//装饰类public class Decorator extends Component {
//定义私有变量Component private Component component; //在构造函数中传入 public Decorator(Component component){ this.component=component; } @Override void test() { if(component!=null){ component.test(); } }}//具体装饰类public class ConcreteDecoratorA extends Decorator{
public ConcreteDecoratorA(Component component){ super(component); } @Override void test() { super.test(); System.out.println("add sugar"); }}//简单调用 ConcreteComponent component=new ConcreteComponent(); ConcreteDecoratorA decoratorA=new ConcreteDecoratorA(component); ConcreteDecoratorB decoratorB=new ConcreteDecoratorB(component); decoratorA.test(); //decoratorB.test();

代码中只是简单的实现,具体业务中还有很多变种,比如java中IO就用到了装饰模式,理解最重要。

转载于:https://www.cnblogs.com/saixing/p/6730198.html

你可能感兴趣的文章
Web前端开发JQuery框架(5)
查看>>
软件开发高手须掌握的4大SQL精髓语句(二)
查看>>
安装好oracle后,打开防火墙遇到的问题!
查看>>
ios通过代码方式获取crash日志
查看>>
MongoDB 之 "$" 的奇妙用法 MongoDB - 5
查看>>
hdu 4398 STL
查看>>
OSINT系列:威胁信息挖掘ThreatMiner
查看>>
ASP.NET运行机制之一般处理程序(ashx)
查看>>
第二次作业
查看>>
BZOJ1191: [HNOI2006]超级英雄Hero
查看>>
BZOJ3506: [Cqoi2014]排序机械臂
查看>>
怎样提升 RailS 应用的性能?
查看>>
svn 批量加入没有加入版本号控制的文件命令
查看>>
1.6 饮料供货
查看>>
SQL Server 如何查询表定义的列和索引信息
查看>>
项目上传到github上
查看>>
GCD 之线程死锁
查看>>
NoSQL数据库常见分类
查看>>
JS小工具_字符串转16进制数组_02
查看>>
信息安全系统设计基础实验四—20135214万子惠20135227黄晓妍
查看>>