一、装饰模式
小菜想要和MM约会需要给自己扮靓,而新入住房子之前也需要对每个房间装修一遍,这些事情都有一个共同的特点,就是一个词“装饰”,我们可以把装饰模式应用在这些事情上面。
装饰模式:就是动态的给一个对象添加一些额外的职责或者是功能,装饰模式比生成子类更为灵活。是给已有功能动态的添加更多功能的一种方式。举一个装修房子的例子来说明一下什么是装饰模式.
//装饰模式
//父类,所有房子的抽象类
abstract class Building
{
public abstract void Spruce();
}
//要装饰的具体房子类,具体的对象,可以给这个对象添加一些职责
class Room : Building
{
//房间编号
private string name;
public Room(string name)
{
this.name = name;
}
//对具体房间的装修
public override void Spruce()
{
Console.WriteLine("房间{0}装修的设备有", name);
}
}
//装饰物品,也属于房子,所以可以抽象成是房子的子类,同时也作为具体装饰物品的父类
abstract class Decorator : Building
{
protected Building building;
public void SetBuliding(Building building)
{
this.building = building;
}
//装修
public override void Spruce()
{
if (building != null)
{
building.Spruce();
}
}
}
//家具
class Furniture : Decorator
{
public override void Spruce()
{
Console.WriteLine(" 家具");
}
}
//电器
class Elecobject : Decorator
{
public override void Spruce()
{
Console.WriteLine(" 家用电器");
}
}
//娱乐设施
class Entertainment : Decorator
{
public override void Spruce()
{
Console.WriteLine(" 娱乐设施");
}
}
//运动设施
class Sports : Decorator
{
public override void Spruce()
{
Console.WriteLine(" 运动设施");
}
}
客户端:
Building room1 = new Room("room1");
Furniture furniture1 = new Furniture();
Elecobject elec = new Elecobject();
Entertainment enter = new Entertainment();
Sports sport = new Sports();
room1.Spruce();
furniture1.Spruce();
elec.Spruce();
enter.Spruce();
sport.Spruce();
Console.Read();
装饰模式的优点:
(1)就是把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效的把类的核心职责和装饰功能区分开了。
(2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计者可以创造出很多不同行为的组合。
装修房间与人的装扮不同,可以没有先后顺序,因为房间内的空间是一定的,装修的家具、电器可以没有先后顺序的放入房间。当有一些家具以后,开可以根据喜好再动态的添加自己喜好的家具,电器等等。
适合装饰者应用场合:
1、当我们需要为某个现有的对象动态的增加一个新的功能或指责时,可以考虑使用装饰模式。
2、当某个对象的指责经常发生变化或者经常需要动态的增加指责,避免为了适应这样的变化,而增加继承子类扩展的方式,因为这种方式会造成子类膨胀的速度过快,难以控制。
五月天有一首歌这样唱道:学长要想把妹子要会弹吉他,T1213121……,如今小菜说,学长不仅要回弹吉他还要学会装饰模式……
装饰模式是某样东西的内容的附加,从而得到新的东西,而外观模式是对一系列的接口进行封装。这就引出了另一个设计模式——外观模式。
二、外观模式
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
例如,使用开关的例子。
//外观模式
//外观类,开关外观
class SwithFacade
{
Light light;
Fan fan;
Telivision telivision;
AirConditioner airconditioner;
public SwithFacade()
{
light = new Light();
fan = new Fan();
telivision = new Telivision();
airconditioner = new AirConditioner();
}
public void Turnon()
{
Console.WriteLine("进门打开");
light.Turnon();
telivision.Turnon();
}
public void Turnoff()
{
Console.WriteLine("出门要记得关闭:");
light.Turnoff();
telivision.Turnoff();
airconditioner.Turnoff();
fan.Turnoff();
}
}
//子系统类
//电灯类
class Light
{
public void Turnon()
{
Console.WriteLine("电灯打开");
}
public void Turnoff()
{
Console.WriteLine("电灯关闭");
}
}
//电风扇类
class Fan
//电视类
//空调类
class AirConditioner
客户端:
SwithFacade facade = new SwithFacade();
facade.Turnon();
facade.Turnoff();
Console.Read();
外观模式的优点是:
(1)将客户端与具体的子系统实现分隔开,提高了子系统的独立性和可移植性。
(2)实现子系统与客户的松耦合性,使得子系统的组件变化不会影响到调用它的客户类,只需调整外观类即可。
(3)只提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
三、装饰模式 VS.外观模式
装饰模式:封装一个对象,并提供额外的行为,用组合的方式来替代继承以扩展类的功能。
外观模式:封装许多对象,以简化它们的接口,此模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用