博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-策略模式
阅读量:756 次
发布时间:2019-03-23

本文共 4941 字,大约阅读时间需要 16 分钟。

设计模式-策略模式

1.问题引出

在这里插入图片描述

2.传统方案解决鸭子问题

package com.atguigu.strategy;public abstract class Duck {
public Duck() {
} public abstract void display();//显示鸭子信息 public void quack() {
System.out.println("鸭子嘎嘎叫~~"); } public void swim() {
System.out.println("鸭子会游泳~~"); } public void fly() {
System.out.println("鸭子会飞翔~~~"); } }
package com.atguigu.strategy;public class PekingDuck extends Duck {
@Override public void display() {
// TODO Auto-generated method stub System.out.println("~~北京鸭~~~"); } //因为北京鸭不能飞翔,因此需要重写fly @Override public void fly() {
// TODO Auto-generated method stub System.out.println("北京鸭不能飞翔"); }}
package com.atguigu.strategy;public class ToyDuck extends Duck{
@Override public void display() {
// TODO Auto-generated method stub System.out.println("玩具鸭"); } //需要重写父类的所有方法 public void quack() {
System.out.println("玩具鸭不能叫~~"); } public void swim() {
System.out.println("玩具鸭不会游泳~~"); } public void fly() {
System.out.println("玩具鸭不会飞翔~~~"); }}
package com.atguigu.strategy;public class WildDuck extends Duck {
@Override public void display() {
// TODO Auto-generated method stub System.out.println(" 这是野鸭 "); }}
package com.atguigu.strategy;public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub //测试 }}

3.传统的方式实现的问题分析和解决方案

  1. 其它鸭子,都继承了Duck类,所以fly让所有子类都会飞了,这是不正确的
  2. 上面说的1 的问题,其实是继承带来的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。会有溢出效应
  3. 为了改进1问题,我们可以通过覆盖fly 方法来解决 => 覆盖解决
  4. 问题又来了,如果我们有一个玩具鸭子ToyDuck, 这样就需要ToyDuck去覆盖Duck
    的所有实现的方法 => 解决思路 策略模式 (strategy pattern)

4.策略模式

基本介绍

  1. 策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以
    互相替换,此模式让算法的变化独立于使用算法的客户
  2. 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;
    第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组 合/ 聚合,少用继承(客户通过组合方式使用策略 )。

策略模式的原理类图

在这里插入图片描述
说明:从上图可以看到,客户context 有成员变量strategy或者其他的策略接口
,至于需要使用到哪个策略,我们可以在构造器中指定.

策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体

设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模
式让行为的变化独立于算法的使用者

5.策略模式解决鸭子问题

在这里插入图片描述

package com.atguigu.strategy.improve;public abstract class Duck {
//属性, 策略接口 FlyBehavior flyBehavior; //其它属性<->策略接口 QuackBehavior quackBehavior; public Duck() {
} public abstract void display();//显示鸭子信息 public void quack() {
System.out.println("鸭子嘎嘎叫~~"); } public void swim() {
System.out.println("鸭子会游泳~~"); } public void fly() {
//改进 if(flyBehavior != null) {
flyBehavior.fly(); } } public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior; } }
package com.atguigu.strategy.improve;public class PekingDuck extends Duck {
//假如北京鸭可以飞翔,但是飞翔技术一般 public PekingDuck() {
// TODO Auto-generated constructor stub flyBehavior = new BadFlyBehavior(); } @Override public void display() {
// TODO Auto-generated method stub System.out.println("~~北京鸭~~~"); } }
package com.atguigu.strategy.improve;public class WildDuck extends Duck {
//构造器,传入FlyBehavor 的对象 public WildDuck() {
// TODO Auto-generated constructor stub flyBehavior = new GoodFlyBehavior(); } @Override public void display() {
// TODO Auto-generated method stub System.out.println(" 这是野鸭 "); }}
package com.atguigu.strategy.improve;public class ToyDuck extends Duck{
public ToyDuck() {
// TODO Auto-generated constructor stub flyBehavior = new NoFlyBehavior(); } @Override public void display() {
// TODO Auto-generated method stub System.out.println("玩具鸭"); } //需要重写父类的所有方法 public void quack() {
System.out.println("玩具鸭不能叫~~"); } public void swim() {
System.out.println("玩具鸭不会游泳~~"); } }
package com.atguigu.strategy.improve;public interface FlyBehavior {
void fly(); // 子类具体实现}
package com.atguigu.strategy.improve;public class NoFlyBehavior implements FlyBehavior{
@Override public void fly() {
// TODO Auto-generated method stub System.out.println(" 不会飞翔 "); }}
package com.atguigu.strategy.improve;public class BadFlyBehavior implements FlyBehavior {
@Override public void fly() {
// TODO Auto-generated method stub System.out.println(" 飞翔技术一般 "); }}
package com.atguigu.strategy.improve;public class GoodFlyBehavior implements FlyBehavior {
@Override public void fly() {
// TODO Auto-generated method stub System.out.println(" 飞翔技术高超 ~~~"); }}
package com.atguigu.strategy.improve;public interface QuackBehavior {
void quack();//子类实现}
package com.atguigu.strategy.improve;public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub WildDuck wildDuck = new WildDuck(); wildDuck.fly();// ToyDuck toyDuck = new ToyDuck(); toyDuck.fly(); PekingDuck pekingDuck = new PekingDuck(); pekingDuck.fly(); //动态改变某个对象的行为, 北京鸭 不能飞 pekingDuck.setFlyBehavior(new NoFlyBehavior()); System.out.println("北京鸭的实际飞翔能力"); pekingDuck.fly(); }}

6.策略模式在JDK-Arrays 应用的源码分析

JDK的 Arrays 的Comparator就使用了策略模式
在这里插入图片描述
7.策略模式的注意事项和细节
在这里插入图片描述

转载地址:http://zstzk.baihongyu.com/

你可能感兴趣的文章