策略模式 :定义了算法族,分别封装起来让他们之后互相替换,此模式让算法的变化独立于使用算法的客户。
遵循的原因:
1、针对接口编程而不是针对实现编程
2、多用组合,少用继承。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Test : MonoBehaviour
{
// Use this for initialization
void Start()
{
Duck duck = new MallardDuck();
duck.PerforFly();
duck.PerforQucak();
Debug.Log("=================================");
MallardDuck mallardDuck = new MallardDuck();
mallardDuck.Display();
mallardDuck.PerforFly();
mallardDuck.PerforQucak();
Debug.Log("=================================");
Duck modelDuck = new ModelDuck();
modelDuck.PerforFly();
modelDuck.PerforQucak();
modelDuck.SetFlyBehavior(new FlyRocketPowered());
modelDuck.PerforFly();
Debug.Log("=================================");
}
}
public class ModelDuck : Duck{
public ModelDuck(){
flyBehavior = new FlyNoWay();
quackBehavior = new SQuack();
}
public void Display(){
Debug.Log("ModelDuck Display !");
}
}
public class MallardDuck : Duck{
public MallardDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new MuteQuack();
}
public void Display()
{
Debug.Log("MallardDuck Display !");
}
}
public abstract class Duck
{
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public Duck()
{
}
public void PerforFly()
{
flyBehavior.fly();
}
public void PerforQucak()
{
quackBehavior.quack();
}
public void Swim()
{
Debug.Log("Duck swim !");
}
public void SetQuackBehavior(QuackBehavior behavior)
{
quackBehavior = behavior;
}
public void SetFlyBehavior(FlyBehavior behavior)
{
flyBehavior = behavior;
}
}
public interface FlyBehavior
{
void fly(); //public ?
}
public interface QuackBehavior
{
void quack();
}
public class FlyWithWings : FlyBehavior
{
public void fly()
{
Debug.Log("FlyWithWings fly!");
}
}
public class FlyNoWay : FlyBehavior
{
public void fly()
{
Debug.Log("FlyNoWay fly!");
}
}
public class FlyRocketPowered : FlyBehavior
{
public void fly()
{
Debug.Log("FlyRocketPowered fly!");
}
}
public class MuteQuack : QuackBehavior
{
public void quack()
{
Debug.Log("MuteQuack quack!");
}
}
public class SQuack : QuackBehavior
{
public void quack()
{
Debug.Log("SQuack quack!");
}
}
策略模式 国王实例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 策略模式 国王实例
/// </summary>
public class StrategyPattern : MonoBehaviour
{
// Use this for initialization
void Start()
{
Character king = new King();
king.Fight();
king.SetWeapon(new KnifeBehavior());
king.Fight();
Queen queen = new Queen();
queen.Play();
queen.Fight();
queen.SetWeapon(new AxeBehavior());
}
}
/// <summary>
/// Character 角色抽象类
/// </summary>
public abstract class Character
{
protected BehaviorWeapon m_weapon;
public void Fight()
{
m_weapon.UseWeapon();
}
public void SetWeapon(BehaviorWeapon weapon)
{
m_weapon = weapon;
}
}
/// <summary>
/// 国王类
/// </summary>
public class King:Character
{
public King()
{
m_weapon = new SwordBehavior();
}
public void Play()
{
Debug.Log("King: my queen i love you");
}
}
/// <summary>
/// 王后类
/// </summary>
public class Queen : Character
{
public Queen()
{
m_weapon = new BowAndArrowBehavior();
}
public void Play()
{
Debug.Log("Queen: my king i love you");
}
}
/// <summary>
/// 使用武器接口
/// </summary>
public interface BehaviorWeapon
{
void UseWeapon();
}
/// <summary>
/// 宝剑挥舞
/// </summary>
public class SwordBehavior : BehaviorWeapon
{
public void UseWeapon()
{
Debug.Log(" SwordBehavior UseWeapon");
}
}
/// <summary>
/// 匕首刺杀
/// </summary>
public class KnifeBehavior : BehaviorWeapon
{
public void UseWeapon()
{
Debug.Log(" KnifeBehavior UseWeapon");
}
}
/// <summary>
/// 弓箭射击
/// </summary>
public class BowAndArrowBehavior : BehaviorWeapon
{
public void UseWeapon()
{
Debug.Log(" BowAndArrowBehavior UseWeapon");
}
}
/// <summary>
/// 斧头劈砍
/// </summary>
public class AxeBehavior : BehaviorWeapon
{
public void UseWeapon()
{
Debug.Log(" BowAndArrowBehavior UseWeapon");
}
}