public abstract class Colleage { private string _name; private string _content; public Colleage(string n) { _name = n; } public string Name { get { return _name;} set { _name = value; } }
public string Content { get { return _content;} set{ _content = value; } } public virtual void Talk(){} }
public class ColleageA : Colleage { public ColleageA(string name): base(name){ } public override void Talk() { base.Talk(); Debug.Log("ColleageA说: " + Content); } } public class ColleageB : Colleage { public ColleageB(string name) : base(name) { } public override void Talk() { base.Talk(); Debug.Log("ColleageB说: " + Content); } }
public class ColleageC : Colleage { public ColleageC(string name) : base(name) { } public override void Talk() { base.Talk(); Debug.Log("ColleageC说: " + Content); } }
public abstract class Meaditor { protected List<Colleage> Colleages = new List<Colleage>(); public virtual void AddColleage(Colleage c){} public virtual void RemoveColleage(Colleage c){} public virtual void Notify(Colleage student){} public virtual void Chart(Colleage A, Colleage B){} }
public class QQMeaditor:Meaditor { public override void AddColleage(Colleage c) { Colleages.Add(c); }
public override void RemoveColleage(Colleage c) { Colleages.Remove(c); }
public override void Notify(Colleage student) { int count = Colleages.Count; for (int i = 0; i < count; i++) { Colleages[i].Talk(); } }
public override void Chart(Colleage A, Colleage B) { A.Talk(); B.Talk(); } }
public class Client:MonoBehaviour { void Start() { //创建单个对象和中介对象QQ QQMeditor qq = new QQMeditor(); ColleageA a = new ColleageA("A"); ColleageB b = new ColleageB("B"); ColleageB c = new ColleageB("C");
class ConcreteAggregate:Aggregate { private IList<object> items = new List<object>();
public override Iterator CreateIterator() { return new ConcreteIterator(this); }
public int Count { get { return items.Count; } }
public object this[int index] { get { return items[index]; } set { items.Insert(index, value); } } }
3.迭代器抽象类:
1 2 3 4 5 6 7
abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); }
//规则:Robert 和 John 是男性 public static Expression getMaleExpression(){ Expression robert = new TerminalExpression("Robert"); Expression john = new TerminalExpression("John"); return new OrExpression(robert, john); }
//规则:Julie 是一个已婚的女性 public static Expression getMarriedWomanExpression(){ Expression julie = new TerminalExpression("Julie"); Expression married = new TerminalExpression("Married"); return new AndExpression(julie, married); }
public static void main(String[] args) { Expression isMale = getMaleExpression(); Expression isMarriedWoman = getMarriedWomanExpression(); System.out.println("John is male? " + isMale.interpret("John")); System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie")); }
abstract class Handler { private string name; public string Name { get { return name; } set { name = value; } } private Handler successor; //定义下家的引用 public Handler Successor { get { return successor; } set { successor = value; } } public abstract bool PassRequest(Request request); }
public class Request { public int Day; public string Reason; public Request(int day, string reason) { Day = day; Reason = reason; } }
class PM:Handler { public PM(string name): base(name){ } public override bool PassRequest(Request request) { int day = request; if (day <= 0.5) { return true; } return Successor.PassRequest(request); }
}
class HR:Handler { public HR(string name): base(name){ } public override bool PassRequest(Request request) { int day = request.Day; string reason = request.Reason; if (day > 0.5&&day<=2) { return true; } return Successor.PassRequest(request); } }
class Manager : Handler { public Manager(string name): base(name){ }
public override bool PassRequest(Request request) { return true; } }
3.具体调用:
1 2 3 4 5 6 7
Request request = new Request(3, "非正当理由"); Boss pm = new PM("pm"); Boss hr = new HR("hr"); Boss manager = new Manager("manager"); pm.Successor = hr; hr.Successor = manager; bool pass = pm.PassRequest(request);
public interface IPlayer { void Play(); } 2.被装饰者ConCreatCompenent实现:
1 2 3 4 5 6 7
public class Player : IPlayer { public void Play() { throw new NotImplementedException(); } }
3.装饰器接口Decorator实现:
public interface IDecorator : IPlayer { } 4.装饰器的抽象基类Decorator实现:
1 2 3 4 5 6 7 8 9
public abstract class DecoratorBase : IDecorator { protected IPlayer play = null; public DecoratorBase(IPlayer player) { this.play = player; } public abstract void Play(); }
public class MusicDecorator : DecoratorBase { public MusicDecorator(IPlayer play) : base(play) { } public override void Play() { throw new NotImplementedException(); } } p ublic class VedioDecorator : DecoratorBase { public VedioDecorator(IPlayer play) : base(play) { } public override void Play() { throw new NotImplementedException(); } }
6.具体调用:由于装饰角色传入一个构件对象的实例,所以装饰的对象的装饰可以精确到具体的装饰角色。
1 2 3 4 5 6
static void Main(string[] args) { IPlayer play = new Player(); play = new MusicDecorator(play); play = new VedioDecorator(play); }