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

 

(接上篇)

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.可以在调用某个真实类的时候加业务逻辑,如权限控制,判断等.

posted @ 2012-03-10 10:02  Quains  阅读(1091)  评论(2编辑  收藏  举报
无觅相关文章插件,快速提升流量