class Program { static void Main(string[] args) { Console.WriteLine("***\r\n Begin program - logging with decorator\r\n"); IRepository<Customer> customerRepository =RepositoryFactory.Create<Customer>(); var customer = new Customer() { Id = 1, Name = "Customer 1", Address = "Address 1" }; customerRepository.Add(customer); customerRepository.Update(customer); customerRepository.Delete(customer); Console.WriteLine("\r\nEnd program - logging with decorator\r\n***"); Console.ReadLine(); } }
public class Customer { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } }
public interface IRepository<T> { void Add(T entity); void Delete(T entity); void Update(T entity); IEnumerable<T> GetAll(); T GetById(int id); }
public class Repository<T> : IRepository<T> { public void Add(T entity) { Console.WriteLine("Adding {0}", entity); } public void Delete(T entity) { Console.WriteLine("Deleting {0}", entity); } public void Update(T entity) { Console.WriteLine("Updating {0}", entity); } public IEnumerable<T> GetAll() { Console.WriteLine("Getting entities"); return null; } public T GetById(int id) { Console.WriteLine("Getting entity {0}", id); return default(T); } }
class DynamicProxy<T> : RealProxy { private readonly T _decorated; public DynamicProxy(T decorated) : base(typeof(T)) { _decorated = decorated; } private void Log(string msg, object arg = null) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(msg, arg); Console.ResetColor(); } public override IMessage Invoke(IMessage msg) { var methodCall = msg as IMethodCallMessage; var methodInfo = methodCall.MethodBase as MethodInfo; Log("In Dynamic Proxy - Before executing '{0}'",methodCall.MethodName); try { var result = methodInfo.Invoke(_decorated, methodCall.InArgs); Log("In Dynamic Proxy - After executing '{0}' ",methodCall.MethodName); return new ReturnMessage(result, null, 0,methodCall.LogicalCallContext, methodCall); } catch (Exception e) { Log(string.Format("In Dynamic Proxy- Exception {0} executing '{1}'", e),methodCall.MethodName); return new ReturnMessage(e, methodCall); } } }
public class RepositoryFactory { public static IRepository<T> Create<T>() { var repository = new Repository<T>(); var dynamicProxy = new DynamicProxy<IRepository<T>>(repository); return dynamicProxy.GetTransparentProxy() as IRepository<T>; } }
class Program { static void Main(string[] args) { IComponent p=new ConcreteComponent(); p.Operation(); Console.WriteLine("---------------------------------"); IComponent d=new ConcreteDecoratorA(p); d.Operation(); Console.ReadLine(); } }
public interface IComponent { void Operation(); }
public class ConcreteComponent : IComponent { public ConcreteComponent() { Console.WriteLine("创建具体构件角色"); } public void Operation() { Console.WriteLine("调用具体构件角色的方法Operation()"); } }
public abstract class Decorator : IComponent { private IComponent component; public Decorator(IComponent component) { this.component=component; } public virtual void Operation() { component.Operation(); } }
public class ConcreteDecoratorA : Decorator { public ConcreteDecoratorA(IComponent component) : base(component) { } public override void Operation() { base.Operation(); AddedFunction(); } public void AddedFunction() { Console.WriteLine("为具体构件角色增加额外的功能AddedFunction()"); } }
public class Program { static void Main(string[] args) { Console.WriteLine("类适配器模式测试:"); ITarget target = new ClassAdapter(); target.Request(); Console.ReadLine(); } }
public interface ITarget { void Request(); }
public class Adaptee { public void SpecificRequest() { Console.WriteLine("适配者中的业务代码被调用!"); } }
public class ClassAdapter : Adaptee,ITarget { public void Request() { SpecificRequest(); } }
public class Program { static void Main(string[] args) { Console.WriteLine("类适配器模式测试:"); Adaptee adaptee = new Adaptee(); ITarget target = new ObjectAdapter(adaptee); target.Request(); Console.ReadLine(); } }
class ObjectAdapter : ITarget { private Adaptee adaptee; public ObjectAdapter(Adaptee adaptee) { this.adaptee=adaptee; } public void Request() { adaptee.SpecificRequest(); } }
public abstract class Mediator { public abstract void Register(Colleague colleague); public abstract void Relay(Colleague colleague); }
public class ConcreteMediator : Mediator { private List<Colleague> colleagues=new List<Colleague>(); public override void Register(Colleague colleague) { if(!colleagues.Contains(colleague)) { colleagues.Add(colleague); colleague.SetMediator(this); } } public override void Relay(Colleague colleague) { foreach (var item in colleagues) { if (!item.Equals(colleague)) { item.Receive(); } } } }
public abstract class Colleague { protected Mediator mediator; public void SetMediator(Mediator mediator) { this.mediator=mediator; } public abstract void Receive(); public abstract void Send(); }
public class ConcreteColleague1 : Colleague { public override void Receive() { Console.WriteLine("具体同事类1收到请求。"); } public override void Send() { Console.WriteLine("具体同事类1发出请求。"); mediator.Relay(this); } }
public class ConcreteColleague2 : Colleague { public override void Receive() { Console.WriteLine("具体同事类2收到请求。"); } public override void Send() { Console.WriteLine("具体同事类2发出请求。"); mediator.Relay(this); } }
public interface IAbstractCommand { void Execute(); }
public class ConcreteCommand1 : IAbstractCommand { private CompositeReceiver receiver; public ConcreteCommand1() { receiver=new CompositeReceiver(); } public void Execute() { receiver.Action1(); } }
public class ConcreteCommand2 : IAbstractCommand { private CompositeReceiver receiver; public ConcreteCommand2() { receiver=new CompositeReceiver(); } public void Execute() { receiver.Action2(); } }
public class CompositeInvoker : IAbstractCommand { private List<IAbstractCommand> children = new List<IAbstractCommand>(); public void Add(IAbstractCommand c) { children.Add(c); } public void Remove(IAbstractCommand c) { children.Remove(c); } public IAbstractCommand GetChild(int i) { return children[i]; } public void Execute() { foreach (var child in children) { child.Execute(); } } }
public class CompositeReceiver { public void Action1() { Console.WriteLine("接收者的Action1()方法被调用..."); } public void Action2() { Console.WriteLine("接收者的Action2()方法被调用..."); } }
class Program { static void Main(string[] args) { AbstractClass tm=new ConcreteClass(); tm.TemplateMethod(); Console.Read(); } }
public abstract class AbstractClass { public void TemplateMethod() { SpecificMethod(); AbstractMethod1(); AbstractMethod2(); } public void SpecificMethod() { Console.WriteLine("抽象类中的具体方法被调用..."); } public abstract void AbstractMethod1(); public abstract void AbstractMethod2(); }
public class ConcreteClass : AbstractClass { public override void AbstractMethod1() { Console.WriteLine("抽象方法1的实现被调用..."); } public override void AbstractMethod2() { Console.WriteLine("抽象方法2的实现被调用..."); } }