前言:设计模式需要反复的用。只有不断学习不断总结,才能真正让别人的知识,变成自己的。
(一)适配器模式
1.是什么
将一个类的接口转换成客户希望的另一个接口。使得原本由于接口不兼容而不能一起工作的那个类可以一起工作。
2.应用
两个国家做贸易,需要进行多次的谈判和签合同。但是语言不通。一个只会说汉语,另一个只会说英语。这时候需要一个即会说英语又会说汉语的翻译,来实现两者之间的沟通。
3.优点
在系统的数据和行文都正确,但是接口与复用环境不一致的时候,使用适配器可以复用一些现存的类。
4.缺点
如果能够事先预防接口不同的问题,不匹配的问题就不会发生。在有小的接口不统一问题发生时,及时重构,问题不至于扩大。只有碰到无法改变原有设计和代码的情况时,才考虑适配。因此适配器模式只能做到事后的解决问题。而不能起到预防的作用。
5.类图
6.代码实现
①代表类
namespace 适配器模式
{
//代表类 抽象出一个代表类,有谈判和签合同的方法
abstract class represent
{
protected string name;
public represent(string name)
{
this.name = name;
}
public abstract void negotiation();
public abstract void sign();
}
②第一次、第二次协商类
//第一次、第二次协商类
class Firsttalk : represent
{
public Firsttalk(string name) :base(name)
{
}
public override void negotiation()
{
Console.WriteLine("第一次{0}谈判", name);
}
public override void sign()
{
Console.WriteLine("第一次{0}签合同", name);
}
}
class Secondtalk : represent
{
public Secondtalk(string name)
: base(name)
{
}
public override void negotiation()
{
Console.WriteLine("第二次{0}谈判", name);
}
public override void sign()
{
Console.WriteLine("第二次{0}签合同", name);
}
}
③需要转换的类
//需要转换的类
class Chinapresent
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public void 谈判()
{
Console.WriteLine("中国代表{0}谈判", name);
}
public void 签合同()
{
Console.WriteLine("中国代表{0}签合同", name);
}
}
④翻译者
//翻译者类
class Translator : represent
{
private Chinapresent zgdb = new Chinapresent();
public Translator(string name)
: base(name)
{
zgdb.Name = name;
}
public override void negotiation()
{
zgdb.谈判();
}
public override void sign()
{
zgdb.签合同();
}
}
⑤客户端代码
class Program
{
static void Main(string[] args)
{
represent c = new Firsttalk("中国代表");
c.negotiation();
c.sign();
represent a = new Secondtalk("美国代表");
a.negotiation();
a.sign();
Console.Read();
}
}
}
(二)装饰模式
1.是什么
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
2.应用
很多小女孩都喜欢芭比娃娃,这时候妈妈给小女孩买了个芭比娃娃,还有很多芭比娃娃的衣服。这时候,只需要一个芭比娃娃和很多衣服,就可以把芭比娃娃装扮成不同风格。如果这个时候,妈妈又给小女孩买了一个男芭比娃娃。小女孩,仍然可以用之前的衣服实现对于男芭比娃娃的换装展示。这样比妈妈给小女孩买一个穿着固定衣服不能换装的芭比娃娃更加灵活。
3.优点
将装饰功能从类中搬移去除,简化原有的类。
4.缺点
装饰模式的顺序非常重要。如果先加密了数据再过滤功能就会出现问题。装饰模式必须在保持装饰类独立的情况下使用。
5.类图
6.代码实现
①Doll类
namespace 装饰模式
{
//Doll类
public class Doll
{
public Doll()
{ }
private string name;
public Doll(string name)
{
this.name = name;
}
public virtual void show()
{
Console.WriteLine("装扮的{0}",name);
}
}
②服饰类
//服饰类
class Finery : Doll
{
protected Doll component;
//装扮
public void Decorate(Doll component)
{
this.component = component;
}
public override void show()
{
if (component != null)
{
component.show();
}
}
}
③具体服饰类
//具体服饰类
class Tshirt : Finery
{
public override void show()
{
Console.Write("娃娃领衬衫");
base.show();
}
}
class Skirt : Finery
{
public override void show()
{
Console.Write("百褶裙");
base.show();
}
}
class Highheeledshoes : Finery
{
public override void show()
{
Console.Write("高跟鞋");
base.show();
}
}
④装扮类
class Program
{
static void Main(string[] args)
{
Doll xz = new Doll("小宅");
Console.WriteLine("第一种装扮:");
Tshirt ts = new Tshirt();
Skirt sk = new Skirt();
Highheeledshoes hhs = new Highheeledshoes();
ts.Decorate(xz);
sk.Decorate(ts);
hhs.Decorate(sk);
hhs.show();
Console.Read();
}
}
}
总结:以上就是适配器模式和装饰模式的分享。后期会不断更新设计模式的分享。因为内容是自己的理解的,代码也是自己敲的,如果有错误欢迎大家指正。代码均可以运行,也欢迎大家去尝试。