设计模式——策略模式
设计原则
1.封装变化
2.针对接口编程,而不是针对实现编程
3.多用组合,少用继承
使用策略模式写的代码
class Program
{
static void Main(string[] args)
{
Duck realDuck = new RealDuck();
realDuck.Display();//父类中放的子类,但是如果方法重写,调用的是子类的方法
realDuck.PerformFly();
realDuck.PerformQuack();
Console.WriteLine("----------");
Duck rubberDuck = new RubberDuck();
rubberDuck.Display();
rubberDuck.PerformFly();
rubberDuck.PerformQuack();
rubberDuck.SetFlyBehavior(new FlyWithWings());//可以动态的改变鸭子的行为
rubberDuck.PerformFly();
Console.ReadKey();
}
}
//输出
/**
我是真的鸭子
我可以飞
真鸭子嘎嘎叫
----------
我是橡皮鸭子
我不会飞
橡皮鸭子吱吱叫
我可以飞
**/
interface IFlyBehavior //接口
{
void Fly();
}
interface IQuackBehavior
{
void Quack();
}
class FlyWithWings : IFlyBehavior //针对接口编程
{
public void Fly()
{
Console.WriteLine("我可以飞");
}
}
class FlyNoWay : IFlyBehavior
{
public void Fly()
{
Console.WriteLine("我不会飞");
}
}
class Quack : IQuackBehavior
{
void IQuackBehavior.Quack()
{
Console.WriteLine("真鸭子嘎嘎叫");
}
}
class SQuack : IQuackBehavior
{
public void Quack()
{
Console.WriteLine("橡皮鸭子吱吱叫");
}
}
abstract class Duck
{
public IFlyBehavior iFlyBehavior;
public IQuackBehavior iQuackBehavior;
public abstract void Display(); //子类中需要重写的方法
public void Swim()//鸭子子类中共有的相同的方法
{
Console.WriteLine("鸭子会游泳");
}
public void PerformFly()
{
iFlyBehavior.Fly(); //接口实例中放的是不同的行为类,调用他们各自的Fly方法来实现多态
}
public void PerformQuack()
{
iQuackBehavior.Quack();
}
public void SetFlyBehavior(IFlyBehavior fb)
{
iFlyBehavior = fb;
}
public void SetQuackBehavior(IQuackBehavior qb)
{
iQuackBehavior = qb;
}
}
class RealDuck : Duck
{
public RealDuck()
{
iFlyBehavior = new FlyWithWings();
iQuackBehavior = new Quack();
}
public override void Display()
{
Console.WriteLine("我是真的鸭子");
}
}
class RubberDuck : Duck
{
public RubberDuck()
{
iFlyBehavior = new FlyNoWay();
iQuackBehavior = new SQuack();
}
public override void Display()
{
Console.WriteLine("我是橡皮鸭子");
}
}
设计谜题
动作冒险游戏,包含代表游戏角色的类和游戏角色使用的武器行为的类。每个角色一次只能使用一种武器,但是可以在游戏过程中更换武器。
class Program
{
static void Main(string[] args)
{
Character king = new King();
king.Fight();
king.SetWeapon(new KnifeBehavior());
king.Fight();
Console.ReadKey();
}
}
//输出
//实现宝剑挥舞
//实现匕首刺杀
interface IWeaponBehavior //行为接口
{
void useWeapon();
}
class KnifeBehavior : IWeaponBehavior //实现行为接口的具体类,在具体类中编写具体函数
{
public void useWeapon()
{
Console.WriteLine("实现匕首刺杀");
}
}
class AxeBehavior : IWeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("实现斧子砍劈");
}
}
class SwordBehavior : IWeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("实现宝剑挥舞");
}
}
abstract class Character
{
public Character()
{
}
public IWeaponBehavior weaponBehavior;
public void Fight()
{
weaponBehavior.useWeapon();
}
public void SetWeapon(IWeaponBehavior w)
{
weaponBehavior = w;
}
}
class King : Character
{
public King()//为什么只有在构造函数里才能访问到weaponBehavior
{
weaponBehavior = new SwordBehavior();
}
}
class Queen : Character
{
public Queen()
{
weaponBehavior = new KnifeBehavior();
}
}
head first 设计模式链接(绿色版)
有用的话希望给个赞,谢谢啦。
后面会继续更新书中的设计模式,一起加油。