慕课网_《模式的秘密之策略模式》学习总结

时间:2017年08月31日星期四
说明:本文部份内容均来自慕课网。@慕课网:http://www.imooc.com
教学源码:https://github.com/zccodere/s...
学习源码:https://github.com/zccodere/s...git

第一章:策略模式简介

1-1 简介

课程大纲github

什么是策略模式
策略模式如何实现
策略模式总结篇
实例案例分享

平常生活中的策略算法

World文档中的排版布局
购物支付过程当中选择支付渠道

案例示意图编程

clipboard.png

策略模式定义架构

策略模式将可变的部分从程序中抽象分离成算法接口,
在该接口下分别封装一系列算法实现并使他们能够相互替换,
从而致使客户端程序独立于算法的改变。

第二章:策略模式应用

2-1 虚拟应用

模拟应用背景框架

经过代码来实现策略模式,经过开发与重构虚拟应用
使用策略模式实现,在不变动代码框架的前提下
不断的拥抱需求的变化,从而知足客户需求

项目背景:鸭子应用ide

clipboard.png

2-2 原有功能

代码编写工具

1.编写Duck类布局

package com.myimooc.designpattern.c7strategy;

/**
 * @title 策略模式
 * @describe 超类,全部的鸭子都要继承此类,抽象了鸭子的行为:显示和鸣叫
 * @author zc
 * @version 1.0 2017-08-31
 */
public abstract class Duck {
    
    /**
     * 鸭子发出叫声,通用行为,由超类实现
     */
    public void quack(){
        System.out.println("嘎嘎嘎");
    }
    
    /**
     * 显示鸭子的外观,鸭子的外观各不相同,声明为abstract,由子类实现
     */
    public abstract void display();
}

2.编写MallardDuck类学习

package com.myimooc.designpattern.c7strategy;

/**
 * @title 策略模式
 * @describe 绿脖子的鸭子
 * @author zc
 * @version 1.0 2017-08-31
 */
public class MallardDuck extends Duck {

    @Override
    public void display() {
        System.out.println("个人脖子是绿色的");
    }
}

3.编写RedheadDuck类

package com.myimooc.designpattern.c7strategy;

/**
 * @title 策略模式
 * @describe 红色头的鸭子
 * @author zc
 * @version 1.0 2017-08-31
 */
public class RedheadDuck extends Duck {

    @Override
    public void display() {
        System.out.println("个人头是红色的");
    }
}

2-3 增长功能

在原有功能的基础上新增飞行的功能

使用继承:父类统一实现
定义抽象方法:由子类本身实现
使用组合:复合优先于继承:多用组合,少用继承

继承优缺点

继承是重用代码的利器
但继承并不老是最好的工具

什么是组合

在类中增长一个私有域,引用另外一个已有的类的实例,经过调用引用实例的方法从而得到新的功能,这种设计被称做组合(或复合)。

使用组合增长飞行功能

实现:将飞行行为抽象为接口,在父类中持有该接口,并由该接口代理飞行行为
优势:足够灵活;复用代码,更易于维护
缺点:策略类会增多;全部策略类都须要对外暴露

2-4 实现功能

代码编写

1.编写FlyingStrategy类

package com.myimooc.designpattern.c7strategy;

/**
 * @title 策略模式
 * @describe 策略接口,实现鸭子的飞行行为
 * @author zc
 * @version 1.0 2017-08-31
 */
public interface FlyingStrategy {
    
    /**
     * 飞行行为的方法
     */
    void performFly();
    
}

2.编写FlyWithWin类

package com.myimooc.designpattern.c7strategy.impl;

import com.myimooc.designpattern.c7strategy.FlyingStrategy;

/**
 * @title 策略模式
 * @describe 实现鸭子的飞行行为,用翅膀飞行的类
 * @author zc
 * @version 1.0 2017-08-31
 */
public class FlyWithWin implements FlyingStrategy{

    @Override
    public void performFly() {
        System.out.println("振翅高飞");
    }
}

3.修改Duck类

package com.myimooc.designpattern.c7strategy;

/**
 * @title 策略模式
 * @describe 超类,全部的鸭子都要继承此类,抽象了鸭子的行为:显示和鸣叫
 * @author zc
 * @version 1.0 2017-08-31
 */
public abstract class Duck {
    
    /**
     * 鸭子发出叫声,通用行为,由超类实现
     */
    public void quack(){
        System.out.println("嘎嘎嘎");
    }
    
    /**
     * 显示鸭子的外观,鸭子的外观各不相同,声明为abstract,由子类实现
     */
    public abstract void display();
    
    // 组合进飞行的策略接口
    private FlyingStrategy flyingStrategy;

    public void setFlyingStrategy(FlyingStrategy flyingStrategy) {
        this.flyingStrategy = flyingStrategy;
    }
    
    /**
     * 鸭子的飞行功能
     */
    public void fly(){
        // 由飞行策略接口执行飞行的动做
        flyingStrategy.performFly();
    }
}

4.修改MallardDuck类

package com.myimooc.designpattern.c7strategy;

import com.myimooc.designpattern.c7strategy.impl.FlyWithWin;

/**
 * @title 策略模式
 * @describe 绿脖子的鸭子
 * @author zc
 * @version 1.0 2017-08-31
 */
public class MallardDuck extends Duck {
    
    public MallardDuck() {
        super();
        super.setFlyingStrategy(new FlyWithWin());
    }
    
    @Override
    public void display() {
        System.out.println("个人脖子是绿色的");
    }
}

5.修改RedheadDuck类

package com.myimooc.designpattern.c7strategy;

import com.myimooc.designpattern.c7strategy.impl.FlyWithWin;

/**
 * @title 策略模式
 * @describe 红色头的鸭子
 * @author zc
 * @version 1.0 2017-08-31
 */
public class RedheadDuck extends Duck {

    public RedheadDuck() {
        super();
        super.setFlyingStrategy(new FlyWithWin());
    }
    
    @Override
    public void display() {
        System.out.println("个人头是红色的");
    }
}

6.编写DuckTest类

package com.myimooc.designpattern.c7strategy;

/**
 * @title 策略模式
 * @describe 测试类
 * @author zc
 * @version 1.0 2017-08-31
 */
public class DuckTest {
    
    public static void main(String[] args) {
        System.out.println("测试鸭子程序");
        System.out.println("*************************");
        
        Duck duck = null;
//        duck = new MallardDuck();
//        duck = new RedheadDuck();
//        duck = new RubberDuck();
//        duck = new BigYellowDuck();
        duck = new SpaceDuck();
        
        duck.display();
        duck.quack();
        duck.fly();
        
        System.out.println("*************************");
        System.out.println("测试程序完毕");
    }
    
}

2-5 复用代码

业务场景

须要增长橡胶鸭、大黄鸭,它们都有一个共同的特色,不会飞行。
不会飞行也是一种飞行行为,因此能够经过良好的抽象复用代码。

代码编写

1.编写FlyNoWay类

package com.myimooc.designpattern.c7strategy.impl;

import com.myimooc.designpattern.c7strategy.FlyingStrategy;

/**
 * @title 策略模式
 * @describe 实现鸭子的飞行行为,不会飞行的策略类
 * @author zc
 * @version 1.0 2017-08-31
 */
public class FlyNoWay implements FlyingStrategy {

    @Override
    public void performFly() {
        System.out.println("我不会飞行!");
    }

}

2.编写RubberDuck类

package com.myimooc.designpattern.c7strategy;

import com.myimooc.designpattern.c7strategy.impl.FlyNoWay;

/**
 * @title 策略模式
 * @describe 橡胶鸭
 * @author zc
 * @version 1.0 2017-08-31
 */
public class RubberDuck extends Duck{
    
    public RubberDuck() {
        super();
        super.setFlyingStrategy(new FlyNoWay());
    }
    
    @Override
    public void display() {
        System.out.println("我全身发黄,嘴巴很红");
    }

    @Override
    public void quack() {
        System.out.println("嘎~嘎~嘎~");
    }
}

3.编写BigYellowDuck类

package com.myimooc.designpattern.c7strategy;

import com.myimooc.designpattern.c7strategy.impl.FlyNoWay;

/**
 * @title 策略模式
 * @describe 大黄鸭
 * @author zc
 * @version 1.0 2017-08-31
 */
public class BigYellowDuck extends Duck{
    
    public BigYellowDuck() {
        super();
        super.setFlyingStrategy(new FlyNoWay());
    }
    
    @Override
    public void display() {
        System.out.println("我身体很大,全身黄黄");
    }
}

4.修改DuckTest类

package com.myimooc.designpattern.c7strategy;

/**
 * @title 策略模式
 * @describe 测试类
 * @author zc
 * @version 1.0 2017-08-31
 */
public class DuckTest {
    
    public static void main(String[] args) {
        System.out.println("测试鸭子程序");
        System.out.println("*************************");
        
        Duck duck = null;
//        duck = new MallardDuck();
//        duck = new RedheadDuck();
//        duck = new RubberDuck();
//        duck = new BigYellowDuck();
        duck = new SpaceDuck();
        
        duck.display();
        duck.quack();
        duck.fly();
        
        System.out.println("*************************");
        System.out.println("测试程序完毕");
    }
    
}

2-6 新增种类

业务场景

如今又需增长太空鸭,太空鸭不能本身飞行,须要借助先进的科学技术。

1编写FlyWithRocket类

package com.myimooc.designpattern.c7strategy.impl;

import com.myimooc.designpattern.c7strategy.FlyingStrategy;

/**
 * @title 策略模式
 * @describe 实现鸭子的飞行行为,使用火箭飞行策略类
 * @author zc
 * @version 1.0 2017-08-31
 */
public class FlyWithRocket implements FlyingStrategy {

    @Override
    public void performFly() {
        System.out.println("用火箭在太空遨游");
    }
}

2.编写SpaceDuck类

package com.myimooc.designpattern.c7strategy;

import com.myimooc.designpattern.c7strategy.impl.FlyWithRocket;

/**
 * @title 策略模式
 * @describe 太空鸭
 * @author zc
 * @version 1.0 2017-08-31
 */
public class SpaceDuck extends Duck {

    public SpaceDuck() {
        super();
        super.setFlyingStrategy(new FlyWithRocket());
    }
    
    @Override
    public void display() {
        System.out.println("我头戴宇航盔");
    }
    
    @Override
    public void quack() {
        System.out.println("我经过无线电与你通讯");
    }

}

3.修改DuckTest类

package com.myimooc.designpattern.c7strategy;

/**
 * @title 策略模式
 * @describe 测试类
 * @author zc
 * @version 1.0 2017-08-31
 */
public class DuckTest {
    
    public static void main(String[] args) {
        System.out.println("测试鸭子程序");
        System.out.println("*************************");
        
        Duck duck = null;
//        duck = new MallardDuck();
//        duck = new RedheadDuck();
//        duck = new RubberDuck();
//        duck = new BigYellowDuck();
        duck = new SpaceDuck();
        
        duck.display();
        duck.quack();
        duck.fly();
        
        System.out.println("*************************");
        System.out.println("测试程序完毕");
    }
    
}

第三章:策略模式总结

3-1 总结

策略模式中的设计原则

找出应用中须要变化的部分,把他们独立出来,不要和那些不须要变化的代码混在一块儿
面向接口编程,而不是面向实现编程
多用组合,少用继承

策略模式的实现

经过分离变化得出的策略接口Strategy
Strategy接口的实现类
客户程序中有一个Strategy
在客户程序中选择和组装正确的Strategy实现类

策略模式的优势

使用了组合,使架构更加灵活
富有弹性,能够较好的应对变化(开闭原则)
更好的代码复用性(相对于继承)
消除大量的条件语句

策略模式的缺点

客户代码须要了解每一个策略实现的细节
增长了对象的数目
全部策略类都须要对外暴露

策略模式的适用场景

许多相关的类仅仅是行为差别
运行时选取不一样的算法变体
经过条件语句在多个分支中选取其中一个
相关文章
相关标签/搜索