浅读《大话设计模式》————6、穿什么有这么重要?——装饰模式
如果不是看到有这么好的一个设计模式,我想我能给的设计也就是小菜扮靓第一版。不会采用第二版的原因是我觉得这样只会更冗余更复杂。如果说穿衣服本身就是人这个对象应该具有的基本属性,那么看起来似乎这种设计也是合理的。关键是人有很多很多穿法,这样无休止下去,维护也是大问题。看来打扮不能简单的做为一种操作,能视为基本操作的只有打扮好了以后展示。如同吃饭可以吃很多不同的东西,吃什么不是基本属性,而只有消化食物才是。理解起来还是比较简单的:无论穿什么,穿好了,就统称服装,所以是服装展示;无论吃什么,吃进去了就是食物,所以就只剩下消化食物了。
装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活[DP]。
我很佩服装饰模式的设计,基本的代码结构无疑让人眼前一亮:
1、Component类
abstract class Component
{
Public abstract void Operation();
}
2、ConcreteComponent类
Classs ConcreteComponent : Component
{
Public override void Operation()
{
Console.WriteLine("具体对象的操作");
}
}
3、Decorator类
Abstract class Decorator:Component
{
Protected Component component;
Public void SetComponent(Component component)
{
This.component = component ;
}
Public override void Operation()
{
If( component != null)
{
Component .Operation();
}
}
}
4、ConcreteDecoratorA 类
Class ConcreteDecoratorA : Decorator
{
Private string addedState; //本类独有功能,以区别于ConcreteDecoratorB
Public override void Operation()
{
base.Operation();
addedState = "New State";
Console.WriteLine("具体装饰对象A的操作");
}
}
Class ConcreteDecoratorB : Decorator
{
Public override void Operation()
{
Base.Operation();
AddedBehavior();
Console.WriteLine("具体装饰对象B的操作");
}
Private void AddedBehavior() //本类独有的方法,以区别于A类
{}
}
5、客户端代码
Static void Main(string [] args)
{
ConcreteComponent c = new ConcreteCompenent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
D1.SetComponent(c);
D2.SetComponent(d1);
D2.operation();
Console.Read();
}
这里用到了面向对象的继承的特性,所以在建立一个对象后,可以完全独立的一步一步的进行装饰,就像一件一件穿衣服似的。难道这样的设计不让人惊叹吗?还有关键的是:“如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。”
装饰模式总结:装饰模式是为了为已有功能动态的添加更多功能的一种方式。
他把每个要装饰的功能放在单独的类中,并让每个类包装他所要装饰的对象,因此,当需要执行特定行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了[DP]。
装饰模式很灵活,灵活到装饰本身并没有限制顺序,大部分时候,超人那种内裤穿在外面的打扮好像不太合时宜,所以要注意装饰的顺序哦~