xzmxddx
学习方式:书籍《Head First 设计模式》,这本书通俗易懂,所有知识点全部取自本书。
封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交互对象之间的松耦合设计而努力
类应该对扩展开放,对修改关闭
依赖抽象,不要依赖具体类
只和朋友交谈
别找我,我会找你
类应该只有一个改变的理由
策略模式:定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的用户。
我的理解:举个例子,玩小游戏的时候,我们需要切换武器,每个武器对象所对应的行为不同,但是我们将这些武器(算法族)封装起来,让它们独立替换,不同的武器,有着不同的效果,这里就可以使用策略模式,武器们实现一个共同的接口即可
这里我使用了鸭子会飞,会叫,这两个行为的例子,鸭子叫声不一样(算法族),飞行行为也不一样(算法族)
eclipse截图:
鸭子抽象类以及子类:
Duck
package hue.edu.xiong.first.duck;
import hue.edu.xiong.first.fly.FlyBehavior;
import hue.edu.xiong.first.quack.QuackBehavior;
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float,even decoys!!");
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
MallardDuck
package hue.edu.xiong.first.duck;
import hue.edu.xiong.first.fly.FlyWithWings;
import hue.edu.xiong.first.quack.Quack;
public class MallardDuck extends Duck {
public MallardDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("It is MallardDuck!!!");
}
}
ModelDuck
package hue.edu.xiong.first.duck;
import hue.edu.xiong.first.fly.FlyNoWay;
import hue.edu.xiong.first.quack.Quack;
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("It is ModelDuck!!!");
}
}
飞行行为接口,以及实现类
FlyBehavior
package hue.edu.xiong.first.fly;
public interface FlyBehavior {
public abstract void fly();
}
FlyNoWay
package hue.edu.xiong.first.fly;
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can't fly!!");
}
}
FlyRocketPowered
package hue.edu.xiong.first.fly;
public class FlyRocketPowered implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying with a rocket!!");
}
}
FlyWithWings
package hue.edu.xiong.first.fly;
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying!!");
}
}
叫声接口,以及实现类
QuackBehavior
package hue.edu.xiong.first.quack;
public interface QuackBehavior {
public abstract void quack();
}
Quack
package hue.edu.xiong.first.quack;
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack");
}
}
MuteQuack
package hue.edu.xiong.first.quack;
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("<< Silence >>");
}
}
Squeak
package hue.edu.xiong.first.quack;
public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("Squeak");
}
}
package hue.edu.xiong.first;
import hue.edu.xiong.first.duck.Duck;
import hue.edu.xiong.first.duck.MallardDuck;
import hue.edu.xiong.first.fly.FlyNoWay;
import hue.edu.xiong.first.quack.MuteQuack;
public class Main {
public static void main(String\[\] args) {
//声明并实例化一只MallardDuck
Duck duck = new MallardDuck();
//测试已经封装的行为
duck.performFly();
duck.performQuack();
duck.display();
//更改已经封装的行为,策略模式要点
duck.setFlyBehavior(new FlyNoWay());
duck.setQuackBehavior(new MuteQuack());
//测试
duck.performFly();
duck.performQuack();
// I'm flying!!
// Quack
// It is ֻMallardDuck!!!
// I can't fly!!
// << Silence >>
}
}
策略模式是我接触到的第一个模式,很好理解,下一个模式是观察者模式
手机扫一扫
移动阅读更方便
你可能感兴趣的文章