using System;
public abstract class Calculate {
public abstract void PositionLabel();
public void SetupCalculate() {
this.PositionLabel();
}
public Calculate() {}
}
public class CalculateDeluxe : Calculate {
public override void PositionLabel() {
Console.WriteLine("Deluxe clock");
}
public CalculateDeluxe() { ;}
}
public class CalculateStandard : Calculate {
public override void PositionLabel() {}
public CalculateStandard() {}
}
class Client {
static void Main(string[] args) {
Calculate delCalculate = new CalculateDeluxe();
delCalculate.SetupCalculate();
Calculate stdCalculate = new CalculateStandard();
stdCalculate.SetupCalculate();
}
}
Design Patterns
Strategy Pattern Demo
using System;
public abstract class Strategy {
public abstract void CreditBusinessRule();
public Strategy() { ;}
}
public class AStrategy : Strategy {
public override void CreditBusinessRule() {
Console.WriteLine("A");
}
public AStrategy() { ;}
}
public class BStrategy : Strategy {
public override void CreditBusinessRule() {
Console.WriteLine("Manager");
}
public BStrategy() { }
}
public class MyContext {
Strategy aStrategy;
public MyContext(Strategy crStrategy) {
this.aStrategy = crStrategy;
}
public void BusinessRule() {
this.aStrategy.CreditBusinessRule();
}
}
class Client {
static void Main(string[] args) {
MyContext cr = new MyContext(new AStrategy());
cr.BusinessRule();
}
}
Singleton Pattern Demo
using System;
sealed class MyClass {
private static bool instanceFlag = false;
public static MyClass GetMyClass() {
if (!instanceFlag) {
instanceFlag = true;
return new MyClass();
} else {
throw new Exception("An engine has already been created!");
}
}
private MyClass() {
Console.WriteLine("An MyClass");
}
}
class Client {
static void Main(string[] args) {
Console.WriteLine("Attempting to get first engine");
try {
MyClass eng = MyClass.GetMyClass();
} catch (Exception e) {
Console.WriteLine(e.Message);
}
Console.WriteLine("Attempting to get second engine");
try {
MyClass eng = MyClass.GetMyClass();
} catch (Exception e) {
Console.WriteLine(e.Message);
}
}
}
Pattern Example: Remote-Proxy
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
public interface IEmployee {
string Design();
string StressTest();
string Mechanical();
string Performance();
}
public class ChiefDesignEngineer : MarshalByRefObject, IEmployee {
public string Design() {
return "Design ";
}
public string StressTest() {
return "stress";
}
public string Mechanical() {
return "mechanical";
}
public string Performance() {
return "performance";
}
public ChiefDesignEngineer() { ;}
}
public class ProxyChiefDesignEngineer : MarshalByRefObject, IEmployee {
private ChiefDesignEngineer chief;
public string Design() {
return this.chief.Design();
}
public string StressTest() {
return this.chief.StressTest();
}
public string Mechanical() {
return "A supplement to mechanical";
}
public string Performance() {
return "Performance information is in the manual.";
}
public ProxyChiefDesignEngineer() {
this.chief = new ChiefDesignEngineer();
}
}
public class Server {
static void Main(string[] args) {
TcpServerChannel channel = new TcpServerChannel(1234);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ProxyChiefDesignEngineer), "RemoteProxy", WellKnownObjectMode.SingleCall);
Console.WriteLine("Press [Enter] to terminate server...");
Console.ReadLine();
}
}
public class Client {
static void Main(string[] args) {
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownClientType
(typeof(ProxyChiefDesignEngineer), "tcp://localhost:1234/RemoteProxy");
ProxyChiefDesignEngineer ukProxyChief = new ProxyChiefDesignEngineer();
Console.WriteLine("Answer: " + ukProxyChief.Performance());
Console.WriteLine("Answer: " + ukProxyChief.Design());
}
}
Proxy Pattern Demo
using System;
public interface IEmployee {
string Design();
string StressTest();
string Mechanical();
string Performance();
}
public class ChiefDesignEngineer : IEmployee {
public string Design() {
return "Design ";
}
public string StressTest() {
return "Stress Test";
}
public string Mechanical() {
return "mechanical";
}
public string Performance() {
return "performance";
}
public ChiefDesignEngineer() { ;}
}
public class ProxyChiefDesignEngineer : IEmployee {
private ChiefDesignEngineer chief;
public string Design() {
return this.chief.Design();
}
public string StressTest() {
return this.chief.StressTest();
}
public string Mechanical() {
return "supplement to mechanical.";
}
public string Performance() {
return "Performance for Chief Design Engineer";
}
public ProxyChiefDesignEngineer() {
this.chief = new ChiefDesignEngineer();
}
}
public class Client {
static void Main(string[] args) {
ProxyChiefDesignEngineer caProxyChief = new ProxyChiefDesignEngineer();
Console.WriteLine(caProxyChief.StressTest());
Console.WriteLine(caProxyChief.Performance());
ProxyChiefDesignEngineer nyProxyChief = new ProxyChiefDesignEngineer();
Console.WriteLine(nyProxyChief.Mechanical());
}
}
Observer Pattern Demo
using System;
public delegate void ChangedEventHandler(object sender, EventArgs e);
public class Subject {
private string data;
public event ChangedEventHandler Changed;
public string Data {
get { return data; }
set {
data = value;
this.OnChanged(EventArgs.Empty);
}
}
protected virtual void OnChanged(EventArgs e) {
if (Changed != null)
this.Changed(this, e);
}
public Subject() { }
}
public class Observer {
private Subject data;
private string observerName;
public Subject ObservedObject {
get { return data; }
set { data = value; }
}
private void DataChanged(object sender, EventArgs e) {
Console.WriteLine("Notification to {0}, {1}", observerName, data.Data);
}
public void Attach() {
data.Changed += new ChangedEventHandler(DataChanged);
}
public void Detach() {
data.Changed -= new ChangedEventHandler(DataChanged);
}
public Observer(string name) {
observerName = name;
}
}
class Client {
static void Main(string[] args) {
Subject sub = new Subject();
Observer observerA = new Observer("A Observer");
Observer observerB = new Observer("B Observer");
observerA.ObservedObject = sub;
observerB.ObservedObject = sub;
observerA.Attach();
observerB.Attach();
sub.Data = "1";
observerA.Detach();
sub.Data = "2";
}
}
Factory Method Pattern
using System;
using System.Collections;
public abstract class Module {
public abstract void SomeModule();
}
public class FeaturesModule : Module {
public override void SomeModule() {
Console.WriteLine("Technical content.");
}
public FeaturesModule() {}
}
public class InstructionModule : Module {
public override void SomeModule() {
Console.WriteLine("Instruction content.");
}
public InstructionModule() {}
}
public class PictureModule : Module {
public override void SomeModule() {
Console.WriteLine("Picture content.");
}
public PictureModule() {}
}
public class TechnicalModule : Module {
public override void SomeModule() {
Console.WriteLine("Technical content.");
}
public TechnicalModule() {}
}
public abstract class Page {
protected ArrayList pageCompositor = new ArrayList();
public abstract void AddModule();
public abstract void DisplayPage();
}
public class CatalogPage : Page {
public override void AddModule() {
this.pageCompositor.Clear();
this.pageCompositor.Add(new FeaturesModule());
this.pageCompositor.Add(new PictureModule());
}
public override void DisplayPage() {
foreach (Module c in this.pageCompositor)
c.SomeModule();
}
public CatalogPage() {
this.AddModule();
}
}
public class ManualPage : Page {
public override void AddModule() {
this.pageCompositor.Clear();
this.pageCompositor.Add(new TechnicalModule());
this.pageCompositor.Add(new PictureModule());
this.pageCompositor.Add(new InstructionModule());
}
public override void DisplayPage() {
Console.WriteLine("Manual page contains:");
foreach (Module c in this.pageCompositor)
c.SomeModule();
Console.WriteLine();
}
public ManualPage() { }
}
class Client {
static void Main(string[] args) {
Page p = new CatalogPage();
p.AddModule();
p.DisplayPage();
p = new ManualPage();
p.AddModule();
p.DisplayPage();
}
}