UML类图:
代码示例:
//策略类
public abstract class Animal
{
public abstract void Run();
}
public class Dog : Animal
{
public override void Run()
{
Console.WriteLine("Dog was running...");
}
}
public class Cat : Animal
{
public override void Run()
{
Console.WriteLine("Cat was running...");
}
}
//Context类,维护一个Animal实例
public class AnimalContext
{
public Animal AnimalInstance { get; set; }
public AnimalContext(Animal animal)
{
this.AnimalInstance = animal;
}
}
策略与简单工厂结合:
//策略类
public abstract class Animal
{
public abstract void Run();
}
public class Dog : Animal
{
public override void Run()
{
Console.WriteLine("Dog was running...");
}
}
public class Cat : Animal
{
public override void Run()
{
Console.WriteLine("Cat was running...");
}
}
//Context类,维护一个Animal实例
public class AnimalContext
{
public Animal AnimalInstance { get; set; }
public AnimalContext(string animalType) //工厂类与Context类合并,构造函数参数string类型
{
switch(animalType)
{
case "Dog":
this.AnimalInstance = new Dog();
break;
case "Cat":
this.AnimalInstance = new Cat();
break;
default:
this.AnimalInstance = null;
break;
}
}
}
Python版本
>>> class BaseClass:
... def BaseFunc(self):
... raise NotImplimentedError("abstract")
...
>>> class ClassA(BaseClass):
... def BaseFunc(self):
... return "This is ClassA"
...
>>> class ClassB(BaseClass):
... def BaseFunc(self):
... return "This is ClassB"
...
>>> class ClassContext:
... BaseClassInstance=None
... def Func(self):
... return self.BaseClassInstance.BaseFunc()
...
>>> classContext=ClassContext()
>>> classContext.BaseClassInstance=ClassA()
>>> classContext.Func()
'This is ClassA'
>>> classContext.BaseClassInstance=ClassB()
>>> classContext.Func()
'This is ClassB'
>>>
与简单工厂的结合使用:
>>> class ClassContext:
... __baseClassInstance=None
... def GetInstance(self, classStr):
... if(classStr=="ClassA"):
... self.__baseClassInstance=ClassA()
... elif(classStr=="ClassB"):
... self.__baseClassInstance=ClassB()
... else:
... pass
... def Func(self):
... return self.__baseClassInstance.BaseFunc()
...
>>> classContext=ClassContext()
>>> classContext.GetInstance("ClassA")
>>> classContext.Func()
'This is ClassA'
>>> classContext.GetInstance("ClassB")
>>> classContext.Func()
'This is ClassB'
>>>