装饰模式
来源:互联网 发布:淘宝卖家账户被冻结 编辑:程序博客网 时间:2024/06/10 10:33
【装饰模式】:
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
Component是定义一个对象接口,可以给这些对象动态的添加职责。
ConcreteComponent是定义一个具体的对象,也可以给这个对象添加一些职责。
Decorator装饰抽象类,继承了Component类,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator类的存在的。至于ConcreteDecorator
就是具体的装饰对象,起到给Component添加职责的功能。
【优点】:把类中的装饰功能从类中搬移到类外,这样可以简化原有的类;能有效的把核心职责和装饰功能区分开,而且可以除去相关类中重复的逻辑。
【示例代码】
using System;
//Component是定义一个对象接口,可以给这些对象动态的添加职责。
abstract class Componet
{
public abstract void Operation();
}
// 具体要操作的对象,实现上面的Componet接口,将要添加的职责移到类外。
class ConcreteComponent : Componet
{
public override void Operation()
{
Console.WriteLine("具体对象的操作");
}
}
// 装饰类基类,也实现Componet接口。并保存一个Componet类的引用。
// 相当于是两次继承。
abstract class Decorator : Componet
{
protected Componet component;
public void SetComponent(Componet component)
{
this.component = component;
}
public override void Operation()
{
if (component != null)
{
//重写Operation(),实际执行的是Component雷的Operation();
component.Operation();
}
}
}
//进行A装饰;
class ConcreteDecoratorA : Decorator
{
private string addedState;
public override void Operation()
{
//先完成本来要进行的操作;
base.Operation();
addedState="new State";
Console.WriteLine("对具体对象进行“A装饰”的操作");
}
}
//进行B装饰;
class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine("对具体对象进行“B装饰”的操作");
}
private void AddedBehavior()
{ }
}
///////////////////////////////////////////////////////////////////////////////
/*客户端代码*/
class APP
{
static void Main()
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
d1.SetComponent(c);//对c进行A装饰;
d2.SetComponent(d1);//对d1进行B装饰;
d2.Operation();
Console.Read();
}
}
例子:以人的装扮为例。
【代码实现】
using System;
//Person类
class Person
{
public Person(){}
private string name;
public Person(string name)
{
this.name=name;
}
public virtual void Show()
{
Console.WriteLine("装扮的{0}",name);
}
}
//服饰类:继承自Person,并维护一个Person的引用。
class Finery:Person
{
protected Person component;
//打扮
public void Decorate(Person component)
{
this.component=component;
}
public override void Show()
{
if(component!=null)
{
component.Show();
}
}
}
//具体服饰类;继承自装饰类;
class TShirts:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("T恤衫");
}
}
class Sneakers:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("胶底运动鞋");
}
}
class Trousers:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("短裤");
}
}
class LeatherShoes:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("皮鞋");
}
}
//客户代码
class App
{
static void Main()
{
Person xs=new Person("小山");
Console.WriteLine("第一种装扮");
Sneakers sk=new Sneakers();
Trousers ts=new Trousers();
TShirts tst=new TShirts();
sk.Decorate(xs);
ts.Decorate(sk);
tst.Decorate(ts);
tst.Show();
}
}
- 装饰模式-撤销装饰
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 策略模式
- Oracle数据库中序列用法
- 用gridview实现可折叠的现实效果
- 使用方法GetPostBackEventReference 得到回发脚本
- 在Demo游戏中添加一个player
- 装饰模式
- pku 2318 TOYS(叉积,二分)
- APS中生产计划排程模块的基本原理
- ObjectARX 获取指定一个图层中的所有实体
- 程序员毕业设计
- Java接口和抽象类的区别?(抽象类中可以定义变量)
- sitemesh的简单实例
- 关于J2EE学习
- 如何保护源代码(来自csdn讨论区)