设计模式_装饰模式

Decorator Pattern 

Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a  flexible alternative
to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活)

不认识的单词

dynamically adv 动态的

alternative   n 可供选择的事务

functionality n 功能

例子

小时候交成绩单给老爸,语文:60  数学:68  自然:87,要知道这样的成绩在小学根本拿不出手,要家长签名那是不可能的,于是乎需要装饰一下,就说"这次这次考试语文最高70,数学最高70,自然最高100",完了再加一句,我排名多少等等。。。。。

也就是说,在原来的基础上再添加俩个功能修饰一下,有人可能会直接使用子类继承来写,但是这样不利于多个,万一有变,遵循开闭原则,在原来的基础上再改,该如何实现呢?

public abstract class SchoolReport {
 public abstract void report();
 public abstract void sign(String name);
}
public class FourthGradeSchoolReport extends SchoolReport {

 @Override
 public void report() {
  System.out.println("尊重的xxx");
  System.out.println("...............");
  System.out.println("语文:60  数学:68  自然:87");
 }

 public void sign(String name) {
  System.out.println("家长签字:"+name);
 }
}

开始修饰

public abstract class Decorator extends SchoolReport {

 private SchoolReport sr;

 public Decorator(SchoolReport sr){
  this.sr=sr;
 }

 @Override
 public void report() {
  this.sr.report();
 }

 @Override
 public void sign(String name) {
  this.sr.sign(name);
 }
}

分析Decorator类

1.为何要继承SchoolReport?  如果不继承的话,下面具体修饰类继承,并且有一个SchoolReport成员,这样每次修饰需要把俩个方法都需要实现俩个方法super.xxx(),这样代码量增加了。

2.为何需要一个SchoolReport成员?  如果没有,那么就无法传递,实现多层包装。

ok,搞定了这个,那么下面就是按照模板来画圆了。

public class HighScoreDecorator extends Decorator {

 public HighScoreDecorator(SchoolReport sr) {
  super(sr);
 }

 private void reportHighScore(){
  System.out.println("这次考试语文最高70,数学最高70,自然最高100");
 }

 @Override
 public void report() {
  this.reportHighScore();
  super.report();
 }
}
public class SortDecorator extends Decorator {

 public SortDecorator(SchoolReport sr) {
  super(sr);
 }

 private void reportSort(){
  System.out.println("我排名38");
 }

 @Override
 public void report() {
  super.report();
  this.reportSort();
 }
}

测试

public static void main(String[] args) {

  SchoolReport sr;
  sr=new FourthGradeSchoolReport();
  sr=new HighScoreDecorator(sr);
  sr=new SortDecorator(sr);
  sr.report();
  sr.sign("Dad");
  //这样老爸自然就开心的签字了
 }

将继承发挥到了极致,必须要懂重写的含义,问题不大,一般这样做的应该不多。

优点

不会耦合

动态扩展功能

缺点

如果最里面的修饰出现了问题,那么问题来了,多蛋疼。所以使用的时候尽量减少修饰类的数量,否则...

使用场景

扩展类功能

动态的增加类功能

为兄弟类进行改装或加装

我是菜鸟,我在路上。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 07-18

设计模式_装饰模式的相关文章

大话设计模式_装饰模式(Java代码)

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 简单描述:1一个父类A(主要给各具体装饰者可以设置待装饰对象),1个具体待装饰类(继承于父类A),1个抽象装饰者(继承父类A),多个具体装饰者(继承抽象装饰者).装饰者持有父类A的引用,每个装饰者在调用方法时都先调用持有的引用的对应方法,另外可在方法中再添加自己的功能(貌似描述得比较复杂,其实就是一传一,每个中间者都可以添加自身的功能) 大话设计模式中的截图: Component是定义一个对象接口,可以给

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

大话设计模式_原型模式(Java代码)

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 简单描述:即通过实现接口Cloneable重写方法clone(),使得创建新的拷贝对象不需要一个成员一个成员的重新复制,而且可以提高创建对象的效率 Java中要想实现拷贝使用clone()方法,类必须实现Cloneable接口,并且重写Object类中的clone()方法,调用父类的clone()方法即可实现浅复制 代码如下: WorkExperience类: 1 package com.longsheng.prototy

大话设计模式_模板方法模式(Java代码)

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 简单描述:多个类的行为是差不多的,只是某些局部不一样,则交由父类中抽象出这些子类中相同的部分,父类中定义出不同的部分的接口(方法),这些不同部分的方法则由子类去实现,通过多态,实现代码的重用 大话设计模式中的截图: 例子代码: AbstractClass类: 1 package com.longsheng.templatemethod; 2 3 public

大话设计模式_适配器模式(Java代码)

适配器模式:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 简单描述: 大话设计模式中的截图: 代码例子: AbstractPlayer类: 1 package com.longsheng.adapter; 2 3 public abstract class AbstractPlayer { 4 5 public abstract void attack(); 6 7 public abstract void defenc

设计模式之装饰模式20170726

结构型设计模式之装饰模式: 一.含义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 通俗来讲,装饰模式是对类的功能进行加强或减弱. 二.代码说明 1.主要有两个角色 1)构件 最核心.最原始.最基本的对象,也就是要装饰的对象. 2)装饰角色 把最核心.最原始.最基本的东西装饰成其他东西 2.在用C实现过程中也是参考这种思想,以修饰成绩单举例,具体实现如下: 1)装饰模式使用场景: 1 /***********************************

大话设计模式_简单工厂模式(Java代码)

简单的描述:一个父类.多个子类,实例化那个子类由一个单独的工厂类来进行 图片摘自大话设计模式: 运算类: 1 package com.longsheng.simpleFactory; 2 3 public class Calculate { 4 5 private double firstNum; 6 private double secondNum; 7 8 public double getFirstNum() { 9 return firstNum; 10 } 11 12 public v