经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式之策略模式
来源:cnblogs  作者:横扫天下  时间:2019/9/10 10:57:46  对本文有异议
策略模式定义:分别封装行为接口,实现算法族,超类里放行为接口的对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。
好处:新增行为简单,行为类更好的复用,组合更方便。既有继承带来的复用好处,没有挖坑
 
闲话少说上代码:
定义一个飞行接口,里面有一个没有方法体的飞行动作:
  1. public interface Fly {
  2. void fly();
  3. }
定义一个叫接口,里面有一个没有方法体的叫动作:
  1. public interface Call {
  2. void call();
  3. }

因为飞行和叫声是变化的,会有各种各样的飞行和叫声,所以我们要把不同的飞行和叫声都实现

  1. public class GoodFly implements Fly {
  2. @Override
  3. public void fly() {
  4. System.out.println("飞的好");
  5. }
  6. }
  7. public class BadFly implements Fly {
  8. @Override
  9. public void fly() {
  10. System.out.println("飞的坏");
  11. }
  12. }
  13. public class GuaCall implements Call {
  14. @Override
  15. public void call() {
  16. System.out.println("呱呱叫");
  17. }
  18. }
  19. public class GaCall implements Call {
  20. @Override
  21. public void call() {
  22. System.out.println("嘎嘎叫");
  23. }
  24. }

这样我们就有了各种各样的飞行和叫声。

然后我们要创建鸭子的超类,超类会持有动作的接口但是没有声明具体的动作

  1. public abstract class Duck {
  2. Fly dfly;
  3. Call dcall;
  4. public Duck(){}
  5. public void fly(){
  6. dfly.fly();
  7. }
  8. public void call(){
  9. dcall.call();
  10. }
  11. }

在超类的子类中会具体设置是哪一种动作

  1. class GreenHeadDuck extends Duck{
  2. public GreenHeadDuck(){
  3. dcall=new GaCall();
  4. dfly=new GoodFly();
  5. }
  6. }
  7. public class RedHeadDuck extends Duck {
  8. public RedHeadDuck(){
  9. dfly=new BadFly();
  10. dcall=new GuaCall();
  11. }
  12. public static void main(String[] args) {
  13. Duck rduck=new RedHeadDuck();
  14. rduck.fly();
  15. rduck.call();
  16. Duck gduck=new GreenHeadDuck();
  17. gduck.fly();
  18. gduck.call();
  19. }
  20. }

策略模式的注意点:

  1. 分析项目中变化部分与不变部分  
  2. 多用组合少用继承;用行为类组合,而不是行为的继承。更有弹性  

 

原文链接:http://www.cnblogs.com/liuqing666/p/11474258.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号