版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lys1695227550/article/details/78311452
文章只是自己在极客学院学习设计模式过程中的一些笔记,便于以后查看
背景:
在面向对象编程中,使用继承时扩展性问题,如果某个对象的方法增加,在超类添加方法,则其下的子类都继承了这个方法,影响范围太大,出现溢出效应。超类挖的一个坑,每个子类都要来填,增加工作量,复杂度O(N^2)。不是好的设计方式
解决:
使用策略模式,抽出变化的部分,抽象成接口+实现,就可以在超类里放行为接口对象,在子类里具体设 定行为对象
原则就是:分离变化部分,封装接口,基于接口编程各种功能。这个模式让行为算法的变化独立于算法的使用。
给出demo:
package duck;
import strategy_pattern.behavior.FlyBehavior;
import strategy_pattern.behavior.QuackBehavior;
public abstract class duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public duck() {
}
public void Fly() {
flyBehavior.fly();
}
public void Quack() {
quackBehavior.quack();
}
public abstract void display();
public void swim() {
System.out.println("~~im swim~~");
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
package duck;
import strategy_pattern.behavior_detial.GaGaQuackBehavior;
import strategy_pattern.behavior_detial.GodeFlyBehavior;
public class GreenDuck extends duck {
public GreenDuck() {
flyBehavior=new GodeFlyBehavior();
quackBehavior=new GaGaQuackBehavior();
}
@Override
public void display() {
System.out.println("-------greenDuck-----");
}
}
package duck;
import strategy_pattern.behavior_detial.badFlyBehavior;
import strategy_pattern.behavior_detial.noQuackBehavior;
public class RedDuck extends duck {
public RedDuck() {
flyBehavior=new badFlyBehavior();
quackBehavior=new noQuackBehavior();
}
@Override
public void display() {
System.out.println("-------redDuck-----");
}
}
package strategy_pattern.behavior;
public interface FlyBehavior {
void fly();
}
package strategy_pattern.behavior;
public interface QuackBehavior {
void quack();
};
public class badFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("bad fly");
}
}
public class GaGaQuackBehavior implements QuackBehavior {
@Override
public void quack() {
System.out.println(" GAGA");
}
}
public class GodeFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("good fly");
}
}
public class noQuackBehavior implements QuackBehavior {
@Override
public void quack() {
System.out.println("no quack");
}
}
package test;
import duck.GreenDuck;
import duck.RedDuck;
import duck.duck;
import strategy_pattern.behavior_detial.GodeFlyBehavior;
import strategy_pattern.behavior_detial.noQuackBehavior;
public class test {
public static void main(String[] args) {
duck greenDuck = new GreenDuck();
duck redDuck = new RedDuck();
greenDuck.display();
greenDuck.Fly();
greenDuck.Quack();
greenDuck.swim();
redDuck.display();
redDuck.Fly();
redDuck.Quack();
redDuck.swim();
redDuck.display();
redDuck.setFlyBehavior(new GodeFlyBehavior());
redDuck.Fly();
redDuck.setQuackBehavior(new noQuackBehavior());
redDuck.Quack();
}
}
-------greenDuck-----
good fly
GAGA
~~im swim~~
-------redDuck-----
bad fly
no quack
~~im swim~~
-------redDuck-----
good fly
no quack
希望对一些朋友有所帮助,如果需要详细的讲解,那得到它的出处了。