- Adapter 匹配不同类型的接口
- Bridge 将抽象与实现解耦
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
Adapter
这种设计模式将【不符合客户预期】的接口,转换成【符合客户预期】的接口。
Client 和 Target类
class Client{
Target target;
public Client(Target _target)
{
target = _target;
}
public void RunTarget()
{
target.TargetInterface();
}
}
class Target{
public virtual void TargetInterface()
{
Console.WriteLine("Called Target Interface");
}
}
Adaptee 和 TargetAdapter
class Adaptee{
public void AdapteeInterface(string name){
Console.WriteLine($"Called Target {name}");
}
}
class TargetAdapter: Target
{
private Adaptee adaptee = new Adaptee();
public override void TargetInterface()
{
adaptee.AdapteeInterface("Adaptee");
}
}
TargetAdapter将Adaptee转换成符合Target的接口。
Bridge
桥接模式,将抽象与实现解耦让两种变化得以独立。
理解桥接模式
假设要建一个工厂生产月饼
按大小分类:大,中,小
按口味分类:甜,咸,辣
abstract class MoonCake{
public abstract void Show();
}
具体的月饼
class BigSweetMoonCake:MoonCake{
public override void Show(){
Console.WirteLine("我是大月饼");
Console.WirteLine("我是甜月饼");
}
}
class BigSaltMoonCake:MoonCake{
public override void Show(){
Console.WirteLine("我是大月饼");
Console.WirteLine("我是咸月饼");
}
}
class BigSpicyMoonCake:MoonCake{
public override void Show(){
Console.WirteLine("我是大月饼");
Console.WirteLine("我是辣月饼");
}
}
....
照这样下去,我们将要实现9个类(3x3),用桥接模式解决此问题。
桥接模
abstract class MoonCakeSize{
public abstract void ShowSize();
}
abstract class MoonCakeTaste{
public abstract void ShowTaste();
}
class MoonCakeImp:MoonCake{
private MoonCakeSize size;
private MoonCakeTaste taste;
public MoonCakeImp(MoonCakeSize _size, MoonCakeTaste _taste)
{
size = _size;
taste = _taste;
}
public override void Show(){
size.ShowSize();
taste.ShowTaste();
}
}
然后实现月饼的大小和口味
class BigMoonCake: MoonCakeSize{
public override void ShowSize()
{
Console.WirteLine("我是大月饼");
}
}
class SmallMoonCake: MoonCakeSize{
public override void ShowSize()
{
Console.WirteLine("我是小月饼");
}
}
...
class SweetMoonCake:MoonCakeTaste
{
public override void ShowTaste()
{
Console.WirteLine("我是甜月饼");
}
}
...
测试代码
// 大甜月饼
MoonCake moonCake = new MoonCakeImp(new BigMoonCake(), new SweetMoonCake());
// 小甜月饼
moonCake = new MoonCakeImp(new SmallMoonCake(), new SweetMoonCake());
让"大小"和”口味“可以独立变化,减少子类的数量这就是桥接模式的作用。
Composite
用树形结构表示部分--整个的层级关系。让客户屏能以统一的形式处理个体对象和组对象。“文件--文件夹”就是一个很好的例子。
抽象类
abstract class Component
{
abstract public void Add(Component component);
abstract public void Remove(Component component);
abstract public void Show(int depth);
}
文件夹
class Dirctory : Component
{
List<Component> components = new List<Component>();
public Dirctory(string name)
{
Name = name;
}
public string Name { get; }
public override void Add(Component component)
{
components.Add(component);
}
public override void Remove(Component component)
{
components.Remove(component);
}
public override void Show(int depth)
{
Console.WriteLine(new String('-', depth) + Name);
foreach (Component component in components)
{
component.Show(depth + 1);
}
}
}
文件
class File : Component
{
public File(string name)
{
Name = name;
}
public string Name { get; }
public override void Add(Component component)
{
}
public override void Remove(Component component)
{
}
public override void Show(int depth)
{
Console.WriteLine(new String('-', depth) + Name);
}
}
测试代码
internal class Program
{
static void Main(string[] args)
{
Component cmp = new Dirctory("Da");
cmp.Add(new File("Fa"));
Component cmpB = new Dirctory("Db");
cmpB.Add(new File("Fb"));
cmp.Add(new File("Fc"));
cmp.Add(cmpB);
cmp.Show(1);
}
}
Decorator
待续...