装饰模式可以动态的为类的方法更换(增强)功能。
假如有一个方法dress(),怎样可以改变其中的逻辑增加功能呢。
常见答案如下
继承,使用子类集成父类,然后override 方法dress()编写自己的逻辑
子类中的方法
@Override
public void dress(){
super.dress();
//自己的逻辑;
}
我们来说说继承的不足之处。首先继承是固定的,也就是说我有几个逻辑就需要继承出几个子类
这里我们借用《大话设计模式》里面的例子——穿衣服
穿衣服是一个搭配。
比如T恤衫牛仔裤,需要做一个类
public T_Pant extends SuperClass{
@Override
public void dress(){
System.out.println("T恤衫");
System.out.println("牛仔裤");
}
}
又一种搭配呢?T恤衫 牛仔裤 大墨镜
public T_Pant_Glass extends SuperClass{
@Override
public void dress(){
System.out.println("T恤衫");
System.out.println("牛仔裤");
System.out.println("大墨镜")
}
}
这样似乎不太好,因为有可以复用的代码。有人说,那我把T_Pant_Glass继承自T_Pant 这样可以复用一部分代码
public T_Pant_Glass extends T_Pant{
@Override
public void dress(){
super.dress();
System.out.println("大墨镜");
}
}
这样好多了,但是要知道人的服装搭配是复杂多变的,如果要穷举出所有的搭配,并对每个搭配制作一个类,这是多么困难的事情。更进一步说,由于服装的搭配在变化,经常需要重构代码,比如上面的例子把“体恤衫牛仔裤大墨镜”类重构了。这样的工作是不是很让人崩溃。
那么怎么办,我们的需求是可以动态的组合这些服饰,想怎么搭配就怎么搭配,而不需要为每个搭配制作新的类。
那么我们对每个服饰做一个类,因为无论如何调整,每一种衣服是穿着搭配的最小单位。
装饰模式开始
1、做一个穿衣服的人的类
public class Person{
protected Person person;
public void dress(){
//什么也不做,因为没有衣服穿
}
}
2、做一个T恤衫类,是Person的子类,这个有点费解,因为不合乎常理,衣服并非是人的子类对吧,这个例子不太恰当,先凑合看,看明白意思就行
public class TShirt extends Person{
public void dress(){
public TShirt(Person p){
this.person = p;
}
System.out.println("穿体恤衫");
super.dress();
}
}
同理做裤子类,墨镜类
public class Pant extends Person{
public void dress(){
public Pant(Person p){
this.person = p;
}
System.out.println("穿裤子");
super.dress();
}
}
public class Glass extends Person{
public void dress(){
public Glass(Person p){
this.person = p;
}
System.out.println("戴墨镜");
super.dress();
}
}
然后呢,我们在客户端把他们串起来,也就是穿起来
main()
{
Person p= new TShirt(new Pant(new Glass(new Person())));
p.dress();
}
这样我们只要更改main函数中的第一句,就可以动态的调整穿什么衣服和穿衣的顺序了。
这个例子的执行顺序是
穿体恤衫
穿裤子
戴墨镜
你们可以试着改变一下顺序哦