码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式_装饰模式

时间:2015-07-20 23:49:40      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:修饰模式


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");
  //这样老爸自然就开心的签字了
 }

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

优点
    不会耦合
    动态扩展功能

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

使用场景
    扩展类功能
    动态的增加类功能
    为兄弟类进行改装或加装

我是菜鸟,我在路上。

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

设计模式_装饰模式

标签:修饰模式

原文地址:http://blog.csdn.net/cjvs9k/article/details/46971785

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!