这里列举行为型模式·到此23种就列完了···这里是看着菜鸟教程来实现··,他里边列了25种,其中过滤器模式和空对象模式应该不属于所谓的23种模式
责任链模式:为请求创建一个接收者对象的链,对请求的发送者和接收者进行解耦,大部分用于web中吧。。
Task中的continuewith和微软的tpl数据流应该是类似这种模式的实现吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //责任链模式 namespace ExercisePrj.Dsignmode { public abstract class AbstractLogger { public static int INFO = 1; public static int DEBUG = 2; public static int ERROR = 3; protected int level; //责任链中的下一个对象 protected AbstractLogger nextLogger; public void SetNextLogger(AbstractLogger next) { nextLogger = next; } public void LogMessage( int level, string message) { if ( this .level<=level) { Write(message); } if (nextLogger!= null ) { nextLogger.LogMessage(level, message); } } protected abstract void Write( string message); } public class ConsoleLogger : AbstractLogger { public ConsoleLogger( int level) { this .level = level; } protected override void Write( string message) { Console.WriteLine( "Standard Console::Logger: " + message); } } public class ErrorLogger : AbstractLogger { public ErrorLogger( int level) { this .level = level; } protected override void Write(String message) { Console.WriteLine( "Error Console::Logger: " + message); } } public class FileLogger : AbstractLogger { public FileLogger( int level) { this .level = level; } protected override void Write(String message) { Console.WriteLine( "File::Logger: " + message); } } } |
命令模式(Command Pattern):请求以命令的形式执行,CAD的的命令应该就是以这种方式执行的·二次开发的时候通过特性标识和继承他的接口来添加命令,非常方便
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //命令模式 namespace ExercisePrj.Dsignmode { public interface IOrder { void Execute(); } public class Stock { private string name = "ABC" ; private int quantity = 10; public void Buy() { Console.WriteLine( "Stock name:{0},quantity:{1},bought" ,name,quantity); } public void Sell() { Console.WriteLine( "Stock name:{0},quantity:{1}sold" , name, quantity); } } //请求类 public class BuyStock : IOrder { private Stock abcStock; public BuyStock(Stock abcStock) { this .abcStock = abcStock; } public void Execute() { abcStock.Buy(); } } //继承接口的实体 public class SellStock : IOrder { private Stock abcStock; public SellStock(Stock abcStock) { this .abcStock = abcStock; } public void Execute() { abcStock.Sell(); } } //命令调用类 public class Broker { private List<IOrder> orderList = new List<IOrder>(); public void takeOrder(IOrder order) { orderList.Add(order); } public void placeOrders() { foreach (IOrder order in orderList) { order.Execute(); } orderList.Clear(); } } } |
解释器模式:就是实现一种表达式接口,C#的各种表达式就是这种实现吧··这玩意跟富文本编辑器一样是个大坑吧··,做好了确实很好使,一不小心就得跪
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //解释器模式 namespace ExercisePrj.Dsignmode { public interface Expression { bool Interpret( string context); } public class TerminalExpression : Expression { private string data; public TerminalExpression( string data) { this .data = data; } public bool Interpret( string context) { if (context.Contains(data)) { return true ; } return false ; } } public class OrExpression : Expression { private Expression expr1 = null ; private Expression expr2 = null ; public OrExpression(Expression expr1, Expression expr2) { this .expr1 = expr1; this .expr2 = expr2; } public bool Interpret(String context) { return expr1.Interpret(context) || expr2.Interpret(context); } } public class AndExpression : Expression { private Expression expr1 = null ; private Expression expr2 = null ; public AndExpression(Expression expr1, Expression expr2) { this .expr1 = expr1; this .expr2 = expr2; } public bool Interpret(String context) { return expr1.Interpret(context) && expr2.Interpret(context); } } } |
迭代器模式(Iterator Pattern):.NET自带接口···,直接实现就行了··注意又泛型接口和非泛型接口··非泛型接口迭代对象返回的是object,泛型接口返回的直接就是对象了,还有通过yield的简化写法不用额外去实现IEnumerator接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExercisePrj.Dsignmode { public class IteratorEx : IEnumerable //<IteratorEx> { public string Name; private List<IteratorEx> list = new List<IteratorEx>(); //public IEnumerator<IteratorEx> GetEnumerator() //{ // foreach (var l in list) // { // yield return l; // } //} public void SetList(List<IteratorEx> data) { list = data; } IEnumerator IEnumerable.GetEnumerator() { foreach (var l in list) { yield return l; } //return new IteratorExEnum(list.ToArray()); } } public class IteratorExEnum : IEnumerator { private IteratorEx[] list; private int position = -1; public IteratorExEnum(IteratorEx[] data) { list = data; } public object Current { get { try { return list[position]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } public bool MoveNext() { position++; return position < list.Length; } public void Reset() { position = -1; } } } |
中介者模式(Mediator Pattern):用一个中介对象封装一些对象的交互,中介者使对象不用显式的互相引用,MVC和mvp 的c和p都是类似这玩意的实现吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExercisePrj.Dsignmode { //中介类 public class ChatRoom { public static void ShowMessage(User user, string msg) { Console.WriteLine( new DateTime().ToString()+ "[" + user.Name + "] : " + msg); } } public class User { public string Name { get ; set ; } public User( string name) { Name = name; } public void SendMessage(String message) { ChatRoom.ShowMessage( this , message); } } } |
备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存,
大部分支持回退的操作场景下应该都是这种模式··之前做的软件中有画图的操作···支持后退,实现方式非常简单粗暴··,直接吧图层的画图对象克隆一份保存··只支持5还是10步,讲道理这么实现确实有点那啥了···
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExercisePrj.Dsignmode { public class Memento { public string State { get ; } public Memento( string state) { State = state; } } public class Originator { public string State { get ; set ; } public Memento SaveStateToMemento() { return new Memento(State); } public void GetStateFromMemento(Memento Memento) { State = Memento.State; } } public class CareTaker { private List<Memento> mementoList = new List<Memento>(); public void Add(Memento state) { mementoList.Add(state); } public Memento Get( int index) { return mementoList[index]; } } } |
观察者模式(Observer Pattern):.net自带的有接口提供来实现观察者模式···这里照着msdn来实现一遍,自带的接口里边还实现了资源的释放··,之前并发编程里边的rx也是这个模式的具体实现·
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //观察者模式 namespace ExercisePrj.Dsignmode { public class Subject: IObservable<Subject> { public int State { get ; set ;} public Subject( int state) { State = state; } private List<IObserver<Subject>> observers = new List<IObserver<Subject>>(); public IDisposable Subscribe(IObserver<Subject> observer) { if (!observers.Contains(observer)) observers.Add(observer); return new Unsubscriber(observers, observer); } private class Unsubscriber : IDisposable { private List<IObserver<Subject>> _observers; private IObserver<Subject> _observer; public Unsubscriber(List<IObserver<Subject>> observers, IObserver<Subject> observer) { this ._observers = observers; this ._observer = observer; } public void Dispose() { if (_observer != null && _observers.Contains(_observer)) _observers.Remove(_observer); } } public void TrackLocation(Subject ob) { Console.WriteLine( "start" ); foreach (var observer in observers) { if (ob== null ) observer.OnError( new Exception( "unknowExeption" )); else observer.OnNext(ob); } } public void EndTransmission() { foreach (var observer in observers.ToArray()) if (observers.Contains(observer)) observer.OnCompleted(); observers.Clear(); } } public class BinaryObserver : IObserver<Subject> { public void OnCompleted() { Console.WriteLine( "complete" ); } public void OnError(Exception error) { Console.WriteLine(error.Message); } public void OnNext(Subject value) { Console.WriteLine( "Binary String: " + Convert.ToString(value.State, 2)); } } public class OctalObserver : IObserver<Subject> { public void OnCompleted() { Console.WriteLine( "complete" ); } public void OnError(Exception error) { Console.WriteLine(error.Message); } public void OnNext(Subject value) { Console.WriteLine( "Octal String: " + Convert.ToString(value.State, 8)); } } public class HexaObserver : IObserver<Subject> { public void OnCompleted() { Console.WriteLine( "complete" ); } public void OnError(Exception error) { Console.WriteLine(error.Message); } public void OnNext(Subject value) { Console.WriteLine( "Hex String: " + Convert.ToString(value.State,16)); } } } |
状态模式(State Pattern):当对象内部状态发生改变时,行为也跟着改变
这个模式是为了解决类里边的大量if和swicth语句,讲道理例子写的有点怪···主体是context
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExercisePrj.Dsignmode { public class Context { public State State { get ; set ; } public Context() { State = null ; } } public interface State { void DoAction(Context context); } public class StartState : State { public void DoAction(Context context) { Console.WriteLine( "Player is in start state" ); context.State = this ; } public override string ToString() { return "Start State" ; } } public class StopState : State { public void DoAction(Context context) { Console.WriteLine( "Player is in stop state" ); context.State = this ; } public override string ToString() { return "Stop State" ; } } } |
空对象模式(Null Object Pattern):就是吧对空值的判断定义一个啥也不做的实体对象出来··C#的Nullable就是这个的实现···这玩意不在23种设计模式里边···
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExercisePrj.Dsignmode { public abstract class AbstractCustomer { public abstract bool IsNull(); public abstract string Name { get ; } } public class RealCustomer : AbstractCustomer { public override string Name { get ; } public RealCustomer( string name) { Name = name; } public override bool IsNull() { return false ; } } public class NullCustomer : AbstractCustomer { public override string Name { get { return "Not Available in Customer Database" ; } } public override bool IsNull() { return true ; } } public class CustomerFactory { public static string [] names = { "Rob" , "Joe" , "Julie" }; public static AbstractCustomer getCustomer( string name) { if (names.Contains(name)) { return new RealCustomer(name); } return new NullCustomer(); } } } |
策略模式(Strategy Pattern):定义一系列算法,封装成类,可以相互替换,通过构造不同的类,执行不同的操作。这样做方便调用,添加新的算法也方便,
最后加了自己之前对这个模式的奇葩写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace ExercisePrj.Dsignmode { public interface IStrategy { int DoOperation( int num1, int num2); } public class OperationAdd : IStrategy { public int DoOperation( int num1, int num2) { return num1 + num2; } } public class OperationSubstract : IStrategy { public int DoOperation( int num1, int num2) { return num1 - num2; } } public class OperationMultiply : IStrategy { public int DoOperation( int num1, int num2) { return num1 * num2; } } public class ContextEx { private IStrategy strategy; public ContextEx(IStrategy strategy) { this .strategy = strategy; } public int ExecuteStrategy( int num1, int num2) { return strategy.DoOperation(num1, num2); } //奇葩的写法简单粗暴 private Dictionary< string , Func< int , int , int >> funcs = new Dictionary< string , Func< int , int , int >>(); public int ExecuteStrategy( string name, int num1, int num2) { if (funcs.Count==0) { //反射写法 var assembly = Assembly.GetExecutingAssembly(); var types = assembly.GetTypes(); foreach (var t in types) { if (t.GetInterface( "IStrategy" ) != null ) { var instance = assembly.CreateInstance(t.FullName) as IStrategy; funcs.Add(t.Name, instance.DoOperation); } } //直接添加 //funcs.Add("OperationAdd", new Func<int, int, int>((n1, n2) => { return n1 + n2; })); //funcs.Add("OperationSubstract", new Func<int, int, int>((n1, n2) => { return n1 - n2; })); //funcs.Add("OperationMultiply", new Func<int, int, int>((n1, n2) => { return n1 * n2; })); } return funcs[name](num1, num2); } } } |
模板模式(Template Pattern):.net的泛型就是这个模式的实现吧··照着模子写就行了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExercisePrj.Dsignmode { public abstract class Game { public abstract void Initialize(); public abstract void StartPlay(); public abstract void EndPlay(); //模板 public void play() { //初始化游戏 Initialize(); //开始游戏 StartPlay(); //结束游戏 EndPlay(); } } public class Cricket : Game { public override void EndPlay() { Console.WriteLine( "Cricket Game Finished!" ); } public override void Initialize() { Console.WriteLine( "Cricket Game Initialized! Start playing." ); } public override void StartPlay() { Console.WriteLine( "Cricket Game Started. Enjoy the game!" ); } } } |
访问者模式(Visitor Pattern):在被访问的类里边加一个对外提供接待访问的接口
把数据结构和对应的操作分开·添加操作很容易,但是如果结构变化多的化,改起来就麻烦了··
没研究没用过····
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExercisePrj.Dsignmode { public interface IComputerPartVisitor { void Visit(Computer computer); void Visit(Mouse mouse); void Visit(Keyboard keyboard); void Visit(Monitor monitor); } public interface IComputerPart { void Accept(IComputerPartVisitor computerPartVisitor); } public class Keyboard : IComputerPart { public void Accept(IComputerPartVisitor computerPartVisitor) { computerPartVisitor.Visit( this ); } } public class Monitor : IComputerPart { public void Accept(IComputerPartVisitor computerPartVisitor) { computerPartVisitor.Visit( this ); } } public class Mouse : IComputerPart { public void Accept(IComputerPartVisitor computerPartVisitor) { computerPartVisitor.Visit( this ); } } public class Computer : IComputerPart { IComputerPart [] parts; public Computer() { parts = new IComputerPart[] { new Mouse(), new Keyboard(), new Monitor() }; } public void Accept(IComputerPartVisitor computerPartVisitor) { for ( int i = 0; i < parts.Length; i++) { parts[i].Accept(computerPartVisitor); } computerPartVisitor.Visit( this ); } } public class ComputerPartDisplayVisitor : IComputerPartVisitor { public void Visit(Computer computer) { Console.WriteLine( "Displaying Computer." ); } public void Visit(Mouse mouse) { Console.WriteLine( "Displaying Mouse." ); } public void Visit(Keyboard keyboard) { Console.WriteLine( "Displaying Keyboard." ); } public void Visit(Monitor monitor) { Console.WriteLine( "Displaying Monitor." ); } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。