天天看点

策略模式(Strategy)定义策略模式要点:UML图应用 在java的api中Comparable和Comparator是Strategy的一个应用。 Comparator与Comparable的简单应用

策略模式(Strategy)

我很苦恼啊,UML图没发显示,我添加到附件了

定义

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式要点:

①       封装算法

②       算法可以相互替换

UML图

这个《java设计模式》一书中的图例。

Context:应用上下文类,持有一个Strategy的对象

Strategy:策略的接口

ConcreteStrategy1,2:接口的实现类(即不同的可以相互替代的算法)

应用

报表中要使用不同的图案表示同样的数据。

package com.dp;

//Strategy

public interface DiagramStrategy {

      void generateDiagram();

}

//ConcreteStrategy

public class CuboidDiagramStrategy implements DiagramStrategy {

      @Override

      public void generateDiagram() {

            // TODO Auto-generated method stub

            System.out.println("输出立方形图形(CuboidDiagramStrategy)");

      }

}

public class CylinderDiagramStrategy implements DiagramStrategy {

      @Override

      public void generateDiagram() {

            // TODO Auto-generated method stub

            System.out.println("输出圆柱形图形(CylinderDiagram)");

      }

}

//Context应用场景

public class ReportForm {

      //生成报表的策略

      private DiagramStrategy strategy;

      public ReportForm(DiagramStrategy strategy) {

            super();

            this.strategy = strategy;

      }

      //产生报表中的图形

      public void generateDiagram(){

            strategy.generateDiagram();

      }

      public DiagramStrategy getStrategy() {

            return strategy;

      }

      //设置产生图形的策略

      public void setStrategy(DiagramStrategy strategy) {

            this.strategy = strategy;

      }

}

在java的api中Comparable和Comparator是Strategy的一个应用。

Package java.uitl;

public interface Comparator<T> {

    int compare(T o1, T o2);

    boolean equals(Object obj);

}

package java.lang;

public interface Comparable<T> {

    public int compareTo(T o);

}

Comparator与Comparable的简单应用

UML图

即设计两个接口,Comparable和Comparator,有一个类Cat,它有两个属性Height,Weight,我们可以按照Height或者Weight给他们分辨大小,因此我们可以有两种算法。这样就可以使用Strategy类了。

public class CatWeightComparator implements Comparator<Cat> {

      @Override

      public int compare(Cat o1, Cat o2) {

            if(o1.getWeight() > o2.getWeight()) return 1;

            else if(o1.getWeight() < o2.getWeight()) return -1;

            return 0;

      }

}

import com.model.Cat;

public class CatHeightComparator implements Comparator<Cat> {

      @Override

      public int compare(Cat o1, Cat o2) {

            if(o1.getHeight()> o2.getHeight()) return 1;

            else if(o1.getHeight() < o2.getHeight()) return -1;

            return 0;

      }

}

public class Cat implements Comparable<Cat> {

      //比较器

      private Comparator<Cat> comparator;

      //构造器

      public Cat(float height, float weight) {

            super();

//          this.comparator = comparator;

            this.height = height;

            this.weight = weight;

      }

      //猫的属性

      private float height;

      private float weight;

      @Override

      public int compareTo(Cat o) {

            //返回比较的值

            return comparator.compare(this, o);

      }

      public float getHeight() {

            return height;

      }

      public void setHeight(float height) {

            this.height = height;

      }

      public float getWeight() {

            return weight;

      }

      public void setWeight(float

继续阅读