浅读《大话设计模式》————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]。

装饰模式很灵活,灵活到装饰本身并没有限制顺序,大部分时候,超人那种内裤穿在外面的打扮好像不太合时宜,所以要注意装饰的顺序哦~

你可能感兴趣的:(设计模式,c,Decorator,String,null)