设计模式2---结构模式
  JWGppPCsR1pT 2023年11月02日 57 0
  1. Adapter 匹配不同类型的接口
  2. Bridge 将抽象与实现解耦
  3. Composite
  4. Decorator
  5. Facade
  6. Flyweight
  7. 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

待续...

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  anLrwkgbyYZS   2023年12月30日   33   0   0 ideciciMaxideMax
JWGppPCsR1pT