装饰模式----设计模式系列
2015-11-01 15:21
453 查看
装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类。可以有效地把类的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。
使用场景:为已有功能动态地添加更多功能的一种方式。
下面以一个小Demo为例讲解:Tshirts(Shoe、Kuzi) extends Finery ,Finery extends Person 。Decorate为测试类
(1)被装饰的类
(2)装饰类
public class Finery extends Person {
protected Person mPerson;
public void decorate(Person person) {
mPerson = person;
}
@Override
public void show() {
if (mPerson != null) {
mPerson.show();
}
}
}
(3)具体装饰类Tshirt (Shoe和Kuzi同理)
public class TShirts extends Finery {
@Override
public void show() {
System.out.println("TShirts");
super.show();
}
}(4)测试类
/**装饰者模式*/
public class Decorate {
public static void main(String[] args) {
Person mPerson = new Person();
mPerson.setName("董永康");
TShirts mTShirts = new TShirts();
Kuzi mKuzi = new Kuzi();
Shoe mShoe = new Shoe();
mTShirts.decorate(mPerson);
mKuzi.decorate(mTShirts);
mShoe.decorate(mKuzi);
mShoe.show();
}
}
总结:两层继承关系,Tshirts(Shoe、Kuzi) extends Finery extends Person
。Finery作为连接Person和Tshirts类的“桥梁”,子类show中调用super.show,在装饰的时候传递子类对象,然后调用子类对象的show方法。循环直到结束。这样做使每个装饰对象的实现和如何使用这个对象分离开了。每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类。可以有效地把类的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。
使用场景:为已有功能动态地添加更多功能的一种方式。
下面以一个小Demo为例讲解:Tshirts(Shoe、Kuzi) extends Finery ,Finery extends Person 。Decorate为测试类
(1)被装饰的类
public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void show(){ System.out.println("装扮的"+name); } }
(2)装饰类
public class Finery extends Person {
protected Person mPerson;
public void decorate(Person person) {
mPerson = person;
}
@Override
public void show() {
if (mPerson != null) {
mPerson.show();
}
}
}
(3)具体装饰类Tshirt (Shoe和Kuzi同理)
public class TShirts extends Finery {
@Override
public void show() {
System.out.println("TShirts");
super.show();
}
}(4)测试类
/**装饰者模式*/
public class Decorate {
public static void main(String[] args) {
Person mPerson = new Person();
mPerson.setName("董永康");
TShirts mTShirts = new TShirts();
Kuzi mKuzi = new Kuzi();
Shoe mShoe = new Shoe();
mTShirts.decorate(mPerson);
mKuzi.decorate(mTShirts);
mShoe.decorate(mKuzi);
mShoe.show();
}
}
总结:两层继承关系,Tshirts(Shoe、Kuzi) extends Finery extends Person
。Finery作为连接Person和Tshirts类的“桥梁”,子类show中调用super.show,在装饰的时候传递子类对象,然后调用子类对象的show方法。循环直到结束。这样做使每个装饰对象的实现和如何使用这个对象分离开了。每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
相关文章推荐
- 7.nodejs权威指南--加密与压缩
- hdoj 2579 Dating with girls(2) 【BFS&&三维数组标记】
- Spark学习笔记之初识
- 小白学习做项目(1)_使用EntityFramework实现Code First设计数据库(1)
- 小波变换入门知识总结
- 机器学习的基本模型
- 期中总结
- 实现才是目的——《大道至简》第六章读后感
- 信息安全系统设计基础第七周期中总结
- matrix_last_acm_4
- 最常用的排序——快速排序
- 程序员必备:100本免费编程图书(英文)
- No.6 Single Number II 一组数都出现n次除了某个数,找出这个数
- Codestorm:Game with a Boomerang
- 基于opencv的符号提取源代码
- InterView common question
- leetcode@ [209]Minimum Size Subarray Sum
- Codestorm:Game with a Boomerang
- maven的聚合和继承(三)
- C++primer学习:模板编程(2):类模板的定义