zoukankan      html  css  js  c++  java
  • Java设计模式----策略模式

    策略模式(Strategy Pattern)体现了两个很主要的面向对象设计的原则

          1、封装变化的概念。

          2、编程中使用接口。而不是对接口的实现。

      策略模式定义了一个共同的抽象算法接口,其子类实现这个接口定义的方法。而且都有各自不同的实现。这些算法实现能够在client调用它们的时候互不影响的变化。

      子算法之间是弱连接的关系,提高了软件的可扩展性与可重用性。

     策略模式组成

       1、抽象策略角色:策略类。通常由一个接口或者抽象类实现

       2、详细策略角色:包含了相关的算法和行为,可能不止一个详细策略角色

       3、环境角色:持有一个策略类的引用,终于给client调用的。

    策略模式编写步骤

      1、对一组算法抽象出一个共同接口,定义这个共同接口

      2、编写策略类,实现这个借口,每一个策略类都有其独特的实现

      3、编写环境角色类,类中持有一个对共同接口的引用,对策略对象注入如set方法和get方法或者用构造方法完毕赋值


    以下是一个策略模式事例

            刘备要到江东娶老婆了。走之前诸葛亮给赵云(伴郎)三个锦囊妙计。说是按天机拆开解决棘手问题,嘿,还别说,真是攻克了大问题。搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
            先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计。运行,然后获胜。用 JAVA 程序怎么表现这个呢?我们先看类图:


    三个妙计是同一类型的东东。那咱就写个接口:

    package com.sanguo.strategy;
    
    /**
     * 定义策略接口
     * 诸葛亮妙计接口
     * */
    public interface IStrategy {
    	//每一个锦囊妙计都是一个可运行的算法
    	public void operate();
    }
    

    然后再写三个实现类,有三个妙计嘛:

    package com.sanguo.strategy;
    
    /**
     * 走后门算法
     * */
    public class BackDoor implements IStrategy {
    
    	@Override
    	public void operate() {
    		System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
    	}
    
    }
    

    package com.sanguo.strategy;
    
    /**
     * 求吴国太开绿灯算法
     * */
    public class GivenGreenLight implements IStrategy {
    
    	@Override
    	public void operate() {
    		System.out.println("求吴国太开绿灯,放行!

    "); } }


    package com.sanguo.strategy;
    
    /**
     * 孙夫人断后挡追兵
     * */
    public class BlockEnemy implements IStrategy {
    
    	@Override
    	public void operate() {
    		System.out.println("孙夫人断后。挡住追兵");
    	}
    
    }
    

    好了,大家看看。三个妙计是有了,那须要有个地方放这些妙计呀,放锦囊呀:

    package com.sanguo.strategy;
    
    /**
     * 环境角色。主要完毕对特定策略的调用 这里代表诸葛亮装计策的锦囊
     * */
    public class Context {
    	private IStrategy strategy;
    
    	public Context(IStrategy strategy) {
    		this.strategy = strategy;// 构造函数,你要使用的计策算法
    	}
    
    	//使用计谋,看我出招
    	public void operate() {
    		this.strategy.operate();
    	}
    }
    

    然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说。小亮的三个妙计还真是不错,瞅瞅:

    package com.sanguo.strategy;
    
    public class ZhaoYun {
    	public static void main(String[] args) {
    		Context context;
    		// 刚刚到吴国的时候拆第一个
    		context = new Context(new BackDoor()); // 拿到妙计
    		context.operate(); // 拆开运行
    		// 刘备乐不思蜀了,拆第二个了
    		context = new Context(new GivenGreenLight());
    		context.operate(); // 运行了第二个锦囊了
    		// 孙权的小兵追了,咋办?拆第三个
    		context = new Context(new BlockEnemy());
    		context.operate(); // 孙夫人退兵
    	}
    }
    

    运行结果。

  • 相关阅读:
    WPF 分页控件Pager
    vue Map 渲染DOM
    IDEA 开发工具 Mybatis 快速开发插件 ==》MyBatisX
    令自己的本地ip可以被外网访问
    mybatis按datetime条件查询,参数为时间戳时
    springmvc传参---LocalDateTime、Date等时间类型转换
    java excel导出(表头合并,多行表头)
    JMeter学习工具简单介绍
    idea项目 run、debug变灰色的问题
    vue的ui库使用Element UI,纯html页面,不使用webpack那玩意
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7381406.html
Copyright © 2011-2022 走看看