java设计模式学习笔记之装饰模式
尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697
这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧《[倾力之作]android轻量级网络请求框架MyHttputils2.1.6》
装饰模式(Decorator):动态地为对象添加一些额外的职责(功能),就增加功能来说,装饰模式比生成子类更为灵活。
场景还原
今天穿什么衣服?如何搭配?
两个人:皮特和萨米,他们今天要穿什么衣服呢?
简单点就来说说怎么实现下面的结果吧!
简单实现
这还不简单?看我的:
public static void main(String[] args) {
System.out.println("第一种装扮\n" +
"皮特-----------装扮开始---------\n" +
"\t穿T-Short\t\t传西装\n" +
"\n" +
"第二种装扮\n" +
"萨米-----------装扮开始---------\n" +
"\t穿裙子\t\t穿高跟鞋");
}
哈哈,确实这种是最简单的方式了
既然咋们讲装饰模式 就来点设计模式的方式实现吧
装饰模式的实现
得有个Person类吧?(说来就来)
public class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public void show() {
System.out.println( name+"-----------装扮开始---------");
}
}
装饰模式需要有一个装饰类的公共父类,这样便于子类动态扩展功能
/**
* 服装装饰类----所有装饰类的父类
* Created by HDL on 2016/12/1.
*/
public class FinaryDecotator extends Person {
private Person person;
//打扮谁
public void decoration(Person person) {
this.person = person;
}
@Override
public void show() {
if (person != null) {
person.show();
}
}
}
下面就是具体的搭配类
高跟鞋类
/**
* 高跟鞋
* Created by HDL on 2016/12/1.
*/
public class HShoseFinaryDecotator extends FinaryDecotator {
@Override
public void show() {
super.show();
System.out.print("\t穿高跟鞋\t");
}
}
裙子类
/**
* 同样是具体的装饰类-----裙子类
* Created by HDL on 2016/12/1.
*/
public class SkirtFinaryDecotator extends FinaryDecotator {
@Override
public void show() {
super.show();
System.out.print("\t穿裙子\t");
}
}
T-Short类
/**
* 具体的服装修饰类-----T-Short类
* Created by HDL on 2016/12/1.
*/
public class TShortFinaryDecotator extends FinaryDecotator {
@Override
public void show() {
super.show();
System.out.print("\t穿T-Short\t");
}
}
西装类
/**
* 西装
* Created by HDL on 2016/12/1.
*/
public class SuitFianry extends FinaryDecotator {
@Override
public void show() {
super.show();
System.out.print("\t传西装\t");
}
}
使用
来看看怎么装饰?
public static void main(String[] args) {
System.out.println("第一种装扮");
Person peter = new Person("皮特");
TShortFinaryDecotator tShort = new TShortFinaryDecotator();//衬衫
SuitFianry suitFianry = new SuitFianry();//西装
tShort.decoration(peter);//衬衫来修饰皮特
suitFianry.decoration(tShort);//西装来修饰衬衫
suitFianry.show();//穿好了
System.out.println("\n\n\n\n第二种装扮");
Person sami = new Person("萨米");
SkirtFinaryDecotator skirtFinary = new SkirtFinaryDecotator();//裙子
HShoseFinaryDecotator hShoseFinary = new HShoseFinaryDecotator();//高跟鞋
skirtFinary.decoration(sami);//萨米先穿裙子(裙子修饰萨米)
hShoseFinary.decoration(skirtFinary);//再穿上高跟鞋(高跟鞋修饰裙子)
hShoseFinary.show();//穿好了
}
通过注释你会发现,其实装饰模式就是一个子类修饰另一个子类,具体执行顺序由调用者来决定。
总结
装饰模式是为已有功能动态地添加更多功能的一种方式。
什么时候用呢?
当系统需要新功能的时候,是向旧的类中添加新的业务代码。这些新加的代码通常修饰了原有类的核心职责或主要行为,这就大大增加了原有类的复杂度,装饰模式提供了一个很好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为的时候,客户代码就可以在运行时根据需要有选择地、按顺序地使用包装类对象来装饰。
装饰类有什么优点?
1、把类中的装饰功能从雷总去除,这样可以简化原有的类;
2、有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。
需要注意什么?
从上面的代码也可以看出,装饰的顺序是很重要的。
尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697