Figure 1 Singleton
class Singleton
{
private static Singleton singleton = null;
public static Singleton Instance()
{
if (null == singleton)
singleton = new Singleton();
return singleton;
}
private Singleton()
{
}
}
Figure 2 Transfer Class
class FileTransfer
{
public virtual void Download(string url, byte[] data, int size)
{
// download the requested resource
}
public virtual void Upload(string url, byte[] data, int size)
{
// upload the requested resource
}
}
Figure 3 Derive from FileTransfer
// decorated file transfer
class Decorator : FileTransfer
{
private FileTransfer ft = new FileTransfer();
private bool IsAccessAllowed(string url)
{
bool result = true;
// determine if access to the
// requested URL should be granted
return result;
}
private void LogAccess(string url)
{
// log URL, time, user identity, etc.
// to some database
Console.WriteLine("Logging access to {0}", url);
}
public override void Download(string url, byte[] data, int size)
{
if (!IsAccessAllowed(url))
return;
ft.Download(url, data, size);
LogAccess(url);
}
// similarly for Upload()
}
Figure 4 LineClass Derives From Shape
class Line : Shape
{
private double x1, y1, x2, y2;
public Line(double x1, double y1,
double x2, double y2)
{
this.x1 = x1; this.y1 = y1;
this.x2 = x2; this.y2 = y2;
}
public void Draw()
{
// draw a line from (x1, y1) to (x2, y2)
}
}
Figure 5 Drawing Class
class Drawing : Shape
{
private ArrayList shapes;
public Drawing()
{
shapes = new ArrayList();
}
public void Add(Shape s)
{
shapes.Add(s);
}
public void Draw()
{
IEnumerator enumerator = shapes.GetEnumerator();
while (enumerator.MoveNext())
((Shape) enumerator.Current).Draw();
}
}
Figure 6 State Class
abstract class State
{
public virtual void AddNickel(VendingMachine vm)
{ }
public virtual void AddDime(VendingMachine vm)
{ }
public virtual void AddQuarter(VendingMachine vm)
{ }
protected virtual void ChangeState(VendingMachine vm, State s)
{
vm.ChangeState(s);
}
}
Figure 7 State Implementations
class Start : State
{
private static State state = new Start();
private Start()
{
}
public static State Instance()
{
// singleton logic
Console.WriteLine("Credit: 0c");
return state;
}
public override void AddNickel(VendingMachine vm)
{
ChangeState(vm, Five.Instance());
}
public override void AddDime(VendingMachine vm)
{
ChangeState(vm, Ten.Instance());
}
public override void AddQuarter(VendingMachine vm)
{
vm.Vend(); // start over
}
}
class Five : State
{
private static State state = new Five();
private Five()
{
}
public static State Instance()
{
// singleton logic
Console.WriteLine("Credit: 5c");
return state;
}
public override void AddNickel(VendingMachine vm)
{
ChangeState(vm, Ten.Instance());
}
public override void AddDime(VendingMachine vm)
{
ChangeState(vm, Fifteen.Instance());
}
public override void AddQuarter(VendingMachine vm)
{
vm.Vend();
ChangeState(vm, Start.Instance());
// no change returned :-)
}
}
Figure 8 VendingMachine Class
class VendingMachine
{
private State state;
public VendingMachine()
{
Console.WriteLine("The Vending Machine is now online: product
costs 25c");
state = Start.Instance();
}
public void ChangeState(State to)
{
state = to;
}
public void Vend()
{
// deliver merchandise
Console.WriteLine("Dispensing product...Thank you!");
}
public void AddNickel()
{
state.AddNickel(this);
}
public void AddDime()
{
state.AddDime(this);
}
public void AddQuarter()
{
state.AddQuarter(this);
}
}
|