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