zoukankan      html  css  js  c++  java
  • JAVA中的设计模式三(策略模式)

    问题:
    如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化?
     
    方案:
    把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。
     
     
    适用情况:
    许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句
     
    优点:
    1、可以动态的改变对象的行为
    缺点:
    1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
    2、策略模式将造成产生很多策略类
     
     应用:
    我们平时出行的方式:出行方式有很多种,具体用哪一种根据动态的选择;
     
     首先创建我们的抽象行为类,和具体的行为类;
     1 package strategy;//策略模式
     2 
     3 //抽象的行为类
     4 public interface Strategy {
     5     public void go();//出行方式
     6 }
     7 
     8 
     9 
    10 
    11 package strategy;
    12 
    13 public class ConcreteStrategy1 implements Strategy {//具体的出行方式
    14 
    15     @Override
    16     public void go() {
    17         // TODO Auto-generated method stub
    18         System.out.println("坐公交车!");
    19     }
    20 
    21 }
    22 
    23 
    24 
    25 
    26 
    27 package strategy;
    28 
    29 public class ConcreteStrategy2 implements Strategy {//具体的出行方式
    30 
    31     @Override
    32     public void go() {
    33         // TODO Auto-generated method stub
    34         System.out.println("自驾车!");
    35     }
    36 }

     然后创建一个调用者,也就是使用者,把能使用的行为给导入进来;

     1 package strategy;
     2 
     3 public class Context {//环境类其实也就是一个调用类,出行的人
     4     private Strategy s;
     5 
     6     public Context(Strategy s) {
     7         super();
     8         this.s = s;
     9     }
    10     public void operate(){
    11         s.go();
    12     }
    13 }

     最后就是进行出行了;

     1 package strategy;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         Context c =new Context(new ConcreteStrategy1());
     6         c.operate();
     7         
     8         c =new Context(new ConcreteStrategy2());
     9         c.operate();
    10     }
    11 }
     
     
     
     
     
     
  • 相关阅读:
    用UILocalNotification实现一个闹钟(Swift)
    Swift
    iOS判断一些权限是否被禁止
    ofbiz学习笔记
    POJ1062 昂贵的聘礼 【DFS】
    echarts 应用数个样例
    java 中缀转后缀(逆波兰)
    开放是否能让苹果成为智能家居的标准制定者?
    2015阿里校招前端在线题目
    hql中不能写count(1)能够写count(a.id)
  • 原文地址:https://www.cnblogs.com/GH0522/p/8274245.html
Copyright © 2011-2022 走看看