Head First 设计模式——策略模式(C#)

设计模式——策略模式

设计原则

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 设计模式链接(绿色版)  

有用的话希望给个赞,谢谢啦。

后面会继续更新书中的设计模式,一起加油。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值