java设计模式之一: 策略模式

比如现在有一个模拟鸭子项目,它们有各自名字,会嘎嘎叫,游泳等。按照普通的面向对象写法

1. 定义一个超类 Duck

package strategyPattern.oo;

public abstract class Duck {

    public Duck() {
    }

    public void Quack() {
        System.out.println("------ gagagaga -----------");
    }

    public abstract void display();


    public void swim() {
        System.out.println("------ im swim -----------");
    }

}

 2. 定义一个类名叫绿头鸭 GeenHeadDuck

package strategyPattern.oo;

public class GeenHeadDuck extends Duck {

    public void display() {
        System.out.println("------- im GreenHeadDuck -------------");
    }
}

 3. 定义一个名叫红头鸭的类 RedHeadDuck

package strategyPattern.oo;

public class RedHeadDuck extends Duck {

    public void display() {
        System.out.println("------------ im red Duck ----------------");
    }
}

4. 测试

 

此时根据结果可以看出, 绿头鸭会嘎嘎叫会游泳, 红头鸭也会嘎嘎叫会游泳。项目需求已现实。如此时提出需求说,鸭子还会飞,那么我们就又得在超类 Duck 加入方法fly

Duck 类

package strategyPattern.oo;

public abstract class Duck {

    public Duck() {
    }

    public void Quack() {
        System.out.println("------ gagagaga -----------");
    }

    public abstract void display();


    public void swim() {
        System.out.println("------ im swim -----------");
    }

    public void fly() {
        System.out.println("----------- im fly ------------");
    }

}

测试

 

此时新增需求完成, 那么此时,又说绿头鸭不会飞,我们又得改在绿头鸭的类

GeenHeadDuck

package strategyPattern.oo;

public class GeenHeadDuck extends Duck {

    public void display() {
        System.out.println("------- im GreenHeadDuck -------------");
    }

    public void fly() {
        System.out.println("----------- no fly ------------");
    }

}

 测试

完成需求, 那么要是此时不止两次鸭子,要是有几百只鸭子,我们在超类增加一个行为方法,那么就会影响所有的子类,从而都需要去修改, 是不是就增加的工作量,耦合度也比较大。这时我们就可以考虑引入设计模式之中的策略模式。

那么我们应该怎么去设计策略模式呢

1. 分析项目中变化与不变化的部分,把变化的部分提取成接口与实现的方式

比如在这模拟鸭子项目中,叫声,和飞行就是变化部分,有点嘎嘎叫,有的咕咕叫,有点不会叫

有点飞得好,有的飞得差,还有的不会飞

 

2. 设计一个叫声的接口

package strategyPattern.pattern.service;

public interface CryService {

    void Quack();

}

3. 设计一个飞行的接口

 

package strategyPattern.pattern.service;

public interface FlyService {

    void fiy();

}

4. 不会叫的实现类

 

package strategyPattern.pattern.service.impl;

import strategyPattern.pattern.service.CryService;

public class NotCryServiceImpl implements CryService {

    public void Quack() {
        System.out.println("------- not quack -------------");
    }
}

 5.  gaga叫的实现类

package strategyPattern.pattern.service.impl;

import strategyPattern.pattern.service.CryService;

public class GaGaCryServiceImpl implements CryService {

    public void Quack() {
        System.out.println("--------------- gaga ----------------");
    }
}

 6. gugu叫的实现类

package strategyPattern.pattern.service.impl;

import strategyPattern.pattern.service.CryService;

public class GuGuCryServiceImpl implements CryService {

    public void Quack() {
        System.out.println("---------- gugu -----------------");
    }
}

7. 不会飞的实现类

 

package strategyPattern.pattern.service.impl;

import strategyPattern.pattern.service.FlyService;

public class NotFylServiceImpl implements FlyService {

    public void fiy() {
        System.out.println("------ not fyl -----------");
    }
}

 8. 飞的差的实现类

package strategyPattern.pattern.service.impl;

import strategyPattern.pattern.service.FlyService;

public class DiffFlyServiceimpl implements FlyService {

    public void fiy() {
        System.out.println("-------------- diff fly ----------------");
    }
}

 9. 飞得好的实现类

package strategyPattern.pattern.service.impl;

import strategyPattern.pattern.service.FlyService;

public class GoodFlyServiceImpl implements FlyService {

    public void fiy() {
        System.out.println("-------- good fly -------------");
    }
}

 10 超类

package strategyPattern.pattern;

import strategyPattern.pattern.service.CryService;
import strategyPattern.pattern.service.FlyService;

public abstract class Duck {

    CryService cryService;

    FlyService flyService;

    public Duck() {
    }

    public void Quack() {
        cryService.Quack();
    }

    public abstract void display();

    public void fly() {
        flyService.fiy();
    }

    /** 动态设置叫声 */
    public void setCryService(CryService cryService) {
        this.cryService = cryService;
    }

    /** 动态设置飞行 */
    public void setFlyService(FlyService flyService) {
        this.flyService = flyService;
    }


}

 11. 红头鸭设置咕咕叫,飞得好

package strategyPattern.pattern;

import strategyPattern.pattern.Duck;
import strategyPattern.pattern.service.impl.GoodFlyServiceImpl;
import strategyPattern.pattern.service.impl.GuGuCryServiceImpl;

public class RedHeadDuck extends Duck {


    public RedHeadDuck() {
        flyService = new GoodFlyServiceImpl();
        cryService = new GuGuCryServiceImpl();
    }

    public void display() {
        System.out.println("------------ im red Duck ----------------");
    }
}

12. 绿头鸭设置嘎嘎叫, 飞的差

package strategyPattern.pattern;

import strategyPattern.pattern.Duck;
import strategyPattern.pattern.service.impl.DiffFlyServiceimpl;
import strategyPattern.pattern.service.impl.GaGaCryServiceImpl;

public class GeenHeadDuck extends Duck {

    public GeenHeadDuck() {
        flyService = new DiffFlyServiceimpl();
        cryService = new GaGaCryServiceImpl();
    }

    public void display() {
        System.out.println("------- im GreenHeadDuck -------------");
    }

}

 

测试

 

完成, 若此时我想设置绿头鸭不会飞, 红头鸭飞的差,只需要调用超类设置方法就好

至此完成!

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值