• 设计模式速查版 结构型(下)


    (接上篇)

    5)外观模式(Facade Pattern)
    6)享元模式(Flyweight Pattern)
    7)代理模式(Proxy Pattern)

    5.外观模式

    1)简介:为子系统中的一组接口提供一个一致的界面.用来向外隐藏内部的具体细节.

    2)结构图:

    Facade

    代码:

    View Code
     1 /// 子系统1 
    2 public class SubSystem1
    3 {
    4 /// <summary></summary>
    5 public void Operation1()
    6 {
    7 Console.Write("operation1...");
    8 }
    9 }
    10
    11 /// 子系统2
    12 public class SubSystem2
    13 {
    14 /// <summary></summary>
    15 public void Operation2()
    16 {
    17 Console.Write("operation2...");
    18 }
    19 }
    20
    21 /// 子系统3
    22 public class SubSystem3
    23 {
    24 /// <summary></summary>
    25 public void Operation3()
    26 {
    27 Console.Write("operation3...");
    28 }
    29 }
    30
    31 /// 外观类
    32 public class Facade
    33 {
    34 private SubSystem1 s1;
    35 private SubSystem2 s2;
    36 private SubSystem3 s3;
    37
    38 public Facade()
    39 {
    40 s1 = new SubSystem1();
    41 s2 = new SubSystem2();
    42 s3 = new SubSystem3();
    43
    44 }
    45
    46 /// <summary></summary>
    47 public void MethodA()
    48 {
    49 s1.Operation1();
    50 s2.Operation2();
    51 s3.Operation3();
    52 }
    53 /// <summary></summary>
    54 public void MethodB()
    55 {
    56 }
    57 }
    58
    59 class Program
    60 {
    61 static void Main(string[] args)
    62 {
    63 Facade facade = new Facade();
    64 facade.MethodA();
    65
    66 //TODO
    67 Console.ReadLine();
    68 }
    69 }



    4)适用:

    当一个业务功能由多个独立负责的功能类组成,此时又不想暴露太多细节给用户,则可以考虑用外观模式给用户提供一个接口.这样可以降低类间的耦合性.

    6. 享元模式

    1)简介:才有缓存策略将相同对象缓存起来而不去生成新的对象.

    2)结构图:

    Flyweight

    3)代码:

    View Code
     1 /// 享元对象工厂(缓存策略) 
    2 public class FlyweightFactory
    3 {
    4 /// 缓存表
    5 private Dictionary<int, Flyweight> flyweights = new Dictionary<int, Flyweight>();
    6
    7 /// <summary></summary>
    8 public Flyweight GetFlyweight(int key)
    9 {
    10 if(!flyweights.ContainsKey(key))
    11 flyweights.Add(key, new ConcreteFlyweight());
    12 return (flyweights[key]);
    13 }
    14 }
    15
    16 /// 享元抽象基类
    17 public abstract class Flyweight
    18 {
    19 }
    20
    21 /// 享元类
    22 public class ConcreteFlyweight : Flyweight
    23 {
    24
    25 }
    26
    27 /// 非享元类(不采取缓存策略)
    28 public class UnsharedConcreteFlyweight : Flyweight
    29 {
    30
    31 }
    32
    33 class Program
    34 {
    35 static void Main(string[] args)
    36 {
    37 FlyweightFactory factory = new FlyweightFactory();
    38
    39 Flyweight f1 = factory.GetFlyweight(1);
    40 Flyweight f2 = factory.GetFlyweight(1);
    41 Flyweight f3 = factory.GetFlyweight(3);
    42
    43 Console.Write(Object.ReferenceEquals(f1,f2)); //TRUE
    44 Console.Write(Object.ReferenceEquals(f1,f3)); //FALSE
    45
    46 //TODO
    47 Console.ReadLine();
    48 }
    49 }



    4)适用:

    系统中需要生成同一个类(或相似类,可通过提取分离变成前者)的大量实例的时候可以考虑采用.缓存用到这个模式.

    7.代理模式

    1)简介:

    为其他对象提供一种代理以控制对这个对象的访问.就是把一个类外面套个'马甲',用户只认识'马甲'而不认识这个类.

    2)结构图:

    Proxy

    3)代码:

    View Code
     1 /// 抽象基类,让Proxy和RealSubject继承,这样在用到RealSubject的地方就可以用到Proxy了 
    2 public abstract class Subject
    3 {
    4 /// <summary></summary>
    5 public abstract void Request();
    6 }
    7
    8 /// 真身
    9 public class RealSubject : Subject
    10 {
    11 /// <summary></summary>
    12 public override void Request()
    13 {
    14 Console.Write("you don not konw me");
    15 }
    16 }
    17
    18 /// 马甲
    19 public class Proxy : Subject
    20 {
    21 private RealSubject realSubject = new RealSubject();
    22 /// <summary></summary>
    23 public override void Request()
    24 {
    25 realSubject.Request();
    26 }
    27 }
    28
    29 class Program
    30 {
    31 static void Main(string[] args)
    32 {
    33 Proxy proxy = new Proxy();
    34 proxy.Request();
    35
    36 //TODO
    37 Console.ReadLine();
    38 }
    39 }



    4)适用:

    1.向外界隐藏真实类. 2.可以在调用某个真实类的时候加业务逻辑,如权限控制,判断等.

  • 相关阅读:
    放苹果
    滑雪-递归
    模数之和
    n个数的最小公倍数
    webapi跨域实现(CROS、JSONP)
    HttpRequestMessage扩展方法
    webapi基于单请求封装多请求的设计【转】
    webapi中获取HttpContext
    webapi序列化控制
    webapi简介及参数绑定
  • 原文地址:https://www.cnblogs.com/Quains/p/2388689.html
Copyright © 2020-2023  润新知