天天看點

政策模式(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

繼續閱讀