装饰模式
来源:互联网 发布:每日一文 知乎 编辑:程序博客网 时间:2024/04/29 13:45
Attach additional responsibities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for ectending functionality.
装饰模式的通用类图
装饰模式的通用源码
抽象构件
public abstract class Component { public abstract void operate();}
具体构件
public class ConcreteComponent extends Component { @Override public void operate() { System.out.println("do Something"); }}
抽象装饰类
public abstract class Decorator extends Component { private Component component; //通过构造函数传递修饰者 public Decorator(Component _component) { this.component = _component; } //委托给被修饰者执行 @Override public void operate() { this.component.operate(); }}
具体装饰类1
public class ConcreteDecorator1 extends Decorator { public ConcreteDecorator1(Component _component) { super(_component); } //定义自己的方法 private void method1() { System.out.println("method1 --->"); } @Override public void operate() { this.method1(); super.operate(); }}
具体装饰者类2
public class ConcreteDecorator2 extends Decorator { public ConcreteDecorator2(Component _component) { super(_component); } //定义自己的方法 private void method2() { System.out.println("method2 =======>"); } @Override public void operate() { this.method2(); super.operate(); }}
场景类
public class Client { public static void main(String[] args) { Component component = new ConcreteComponent(); component = new ConcreteDecorator1(component); component = new ConcreteDecorator2(component); component.operate(); }}
装饰模式的优点
- 装饰类和被装饰类可以独立发展,而不会互相耦合。也就是说:Component类无须知道Decorator类,Decorator类是从外部扩展Component类的功能,二Decorator也不用知道具体的构件。
- 装饰模式是继承关系的一个替代方案。装饰类Decorator不管装饰多少层,返回的对象还是Component。
- 装饰模式可以动态第扩展实现类的功能。
装饰模式的缺点
- 多层装饰是很复杂的。
装饰模式的使用场景
- 需要扩展一个类的功能,或给一个类增加附加功能。
- 需要动态第给一个对象增加功能,这些功能还能动态的删除。
- 需要为一批的兄弟类进行改装或加装功能,当然是首先装饰模式。
装饰模式的简单应用的类图及源码
抽象的学校成绩单(抽象构件类)
public abstract class SchoolReport { // 成绩单展示你的成绩 public abstract void report(); // 成绩单要家长签字 public abstract void sign(String name);}
具体构件类
public class FouthGradeSchoolReport extends SchoolReport { // 我的成绩单 @Override public void report() { // 成绩单的格式是这样的 System.out.println("尊敬的XX家长"); System.out.println("----------------------"); System.out.println("语文:63 数学:65 体育:98 自然:60"); System.out.println("----------------------"); System.out.println(" 家长签字:"); } // 家长签字 @Override public void sign(String name) { System.out.println(" " + name); }}
抽象装饰类
public abstract class Decorator extends SchoolReport { //首先我需要通知是哪个成绩单 private SchoolReport schoolReport; //构造函数,传递成绩单 public Decorator(SchoolReport _schoolReport) { this.schoolReport = _schoolReport; } //成绩单还是要被看的 @Override public void report() { this.schoolReport.report(); } //成绩单看完还是要签名的 @Override public void sign(String name) { this.schoolReport.sign(name); }}
具体装饰者类1
public class HighScoreDecorator extends Decorator { //构造函数 public HighScoreDecorator(SchoolReport _schoolReport) { super(_schoolReport); } //汇报最高成绩 private void reportHighScore() { System.out.println("这次考试语文最高75,数学73,自然71"); } @Override public void report() { this.reportHighScore(); super.report(); }}
具体装饰者类2
public class SortDecorator extends Decorator { //构造函数 public SortDecorator(SchoolReport _schoolReport) { super(_schoolReport); } //说明我的排名情况 private void reportSort() { System.out.println("我这次考试38名"); } //看完,签名 @Override public void report() { super.report(); this.reportSort(); }}
场景类
public class Client { public static void main(String[] args) { SchoolReport schoolReport = null; schoolReport = new FouthGradeSchoolReport(); schoolReport = new HighScoreDecorator(schoolReport); schoolReport = new SortDecorator(schoolReport); schoolReport.report(); schoolReport.sign("world"); }}
1 0
- 装饰模式-撤销装饰
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 扑克牌的顺子
- 七步教你精通Python机器学习
- java中的匿名内部类总结
- 最大子阵 --蓝桥杯
- Instrusive hdu 5040 优先队列+BFS
- 装饰模式
- (5)ICE通信器是干嘛的
- HTTPS协议与SSL协议的完整交互过程
- Android中实现点击变换图片
- 设计模式六大原则
- 【leetcode】Array——First Missing Positive(41)
- 「学习笔记」3.19代码学习
- 19. Remove Nth Node From End of List
- HTML入门(2)