C\#디자인 모델 의 행위 형 모델 에 대한 상세 한 설명
책임 체인 모드:수신 자 대상 의 체인 을 만 들 기 위해 요청 한 발송 자 와 수신 자 를 결합 시 키 고 대부분 웹 에 사용 합 니 다.
Task 의 continue with 와 마이크로소프트 의 tpl 데이터 흐름 은 이런 모델 과 유사 하 게 이 루어 지 는 것 같 습 니 다.
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 의 명령 은 이런 식 으로 실 행 될 것 입 니 다.2 차 개발 시 특성 표지 와 그의 인 터 페 이 스 를 계승 하여 명령 을 추가 하 는 것 이 편리 합 니 다.
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();
}
}
}
해석 기 모드:일종 의 표현 식 인 터 페 이 스 를 실현 하 는 것 입 니 다.
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 자체 인터페이스....................................................................
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 는 모두 이와 유사 한 실현 입 니 다.
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):패 키 징 을 파괴 하지 않 는 전제 에서 대상 의 내부 상 태 를 포착 하고 대상 밖에서 저장 합 니 다.대부분 후퇴 를 지원 하 는 조작 장면 에 서 는 이런 패턴 이 있 을 거 예요..................................................................
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 도 이 모델 의 구체 적 인 실현 입 니 다.
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 입 니 다.
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 가지 디자인 모드 에 있 지 않 습 니 다.
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):일련의 알고리즘 을 정의 하고 클래스 로 봉 하여 서로 바 꿀 수 있 으 며 서로 다른 클래스 를 구성 하여 서로 다른 조작 을 수행 할 수 있 습 니 다.이렇게 하면 호출 이 편리 하고 새로운 알고리즘 을 추가 하 는 것 도 편리 하 다.마지막 으로 이 패턴 에 대한 자신의 기발 한 화법 을 넣 었 습 니 다.
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 의 범 형 은 바로 이 모드 의 실현 입 니 다.
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):방문 한 클래스 에 대외 적 으로 방문 을 받 을 수 있 는 인 터 페 이 스 를 추가 합 니 다.데이터 구조 와 대응 하 는 조작 을 분리 하고 추가 하 는 것 은 쉬 우 나 구조 변화 가 많아 지면 고치 기 가 쉽 지 않 습 니 다.
연 구 는 안 해 봤 는데..
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.");
}
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.