设计模式-装饰模式
装饰模式基本实现
Component类
java
abstract class Component
{
public abstract void Operation();
}
ConcreteComponent类
java
class ConcreteComponent:Component{
public override void Operation(){
Console.WriteLine("具体对象的操作")
}
}
Decorator类
java
abstract class Decorator:Component
{
protected Component component;
public void SetComponent(Component component){
this.component = component;
}
public override void Operation(){
if(component != null){
component.Operation();
}
}
}
ConcreteDecorator相关类
java
class ConcreteDecoratorA:Decrator
{
private string addedState;
public override void Operation(){
base.Operation();
addedState = "New State";
Console.WriteLine("具体装饰对象A的操作");
}
}
class ConcreteDecoratorB:Decrator
{
private string addedState;
public override void Operation(){
base.Operation();
AddedBehavior();
Console.WriteLine("具体装饰对象B的操作");
}
public void AddedBehavior(){
}
}
客户端代码
java
static void Main(string[] args){
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
}
装饰模式实现换装程序
"Person"类 (ConcreteComponent)
java
class Person{
public Person(){}
private string name;
public Person(string name){
this.name = name;
}
public virtual void show(){
Console.WriteLine("装扮的{0}",name);
}
}
服饰类(Decorator)
java
class Finery:Person
{
protected Person component;
//打扮
public void Decorate(Person component){
this.component = component;
}
public override void Show(){
if(component != null){
component.Show();
}
}
}
具体服饰类(ConcreteDecorator)
java
class TShirts:Finery
{
public override void Show(){
Console.Write("大T恤");
base.show();//调用父类的方法
}
}
class BigTrouser:Finery
{
public override void Show(){
Console.Write("垮裤");
base.show();//调用父类的方法
}
}
// ...
客户端代码
java
static void Main(string[] args){
Person xc = new Person("小菜");
Console.WriteLine("\n 第一种装扮:");
Sneakers pqx = new Sneakers();
BigTrouser kk =new BigTrouser();
TShirts dtx = new TShirts();
pqx.Decorate(xc);
kk.Decorate(pqx);
dtx.Decorate(kk);
dtx.show();
}
总结
装饰模式是为已有功能动态地添加更多功能地一种方式。
使用场景:当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为。
优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。