二、定义
策略模式(Strategy)属于对象行为型设计模式,主要是定义一系列的算法,把这些算
法一个个封装成拥有共同接口的单独的类,并且使它们之间可以互换。策略模式使这些算法
在客户端调用它们的时候能够互不影响地变化。这里的算法不要狭义的理解为数据结构中算
法,可以理解为不同的业务处理方法。
这种做法会带来什么样的好处呢?
它将算法的使用和算法本身分离,即将变化的具体算法封装了起来,降低了代码的耦合
度,系统业务策略的更变仅需少量修改。
算法被提取出来,这样可以使算法得到重用,这种情况还可以考虑使用享元模式来共享
算法对象,来减少系统开销(但要注意使用享元模式的建议条件)。
package com.vince.shejimoshi;
//对于每个几何图形而言,都有计算其计算面积的方法,但是具体计算各不相同
//不同的情况我就采用不同的策略啊(哦哦,策略设计模式么,好样的,需要伴随面向接口编程呢)
//为了简化开发,本实例将定义一个超类(无实际作用),使用面向接口编程,计算面积。
//运行效果
//图形的名称是:Circle
//图形的面积是:3.141592653589793
//图形的名称是:Rectangle
//图形的面积是:1.0
public class CeLueTuXing {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Graph g = new Graph();
// 调用圆类的方法
Circle c = new Circle("Circle", 1d);
System.err.println("图形的名称是:" + c.getName());
g.setFigureare(c);
System.out.println("图形的面积是:" + g.figureArea());
// 调用矩形类的方法
Rectangle re = new Rectangle("Rectangle", 1d, 1d);
System.out.println("图形的名称是:" + re.getName());
g.setFigureare(re);
System.out.println("图形的面积是:" + g.figureArea());
}
}
// 多余的注释
// 记住:抽象类中可以有普通方法、抽象方法、构造方法
// 抽象类可以不包含抽象方法,也就是抽象类中的方法都是普通方法
// 含有抽象方法的类一定是抽象类,抽象类不一定要含有抽象方法
class Graph {
// 定义一个接口类型变量
private FigureArea figureare;
// 属性的读写操作
public FigureArea getFigureare() {
return figureare;
}
// FigureArea figureare=new Circle("Circle", 1d);仔细看清楚,用到多态
// 所以,接口也有多态性
public void setFigureare(FigureArea figureare) {
this.figureare = figureare;
}
// 将变化的方法写进来(传啥类的对象进来,就调用啥类中的方法)
public double figureArea() {
return figureare.figureArea();
}
}
// 将计算面积的方法抽象为一个接口
interface FigureArea {
// 里面的方法默认是public abstract
public double figureArea();
}
// 第一个算法
class Circle implements FigureArea {
private String name;
private double r;
// 获取名称和半径
public Circle(String name, double r) {
this.name = name;
this.r = r;
}
// 属性的读写操作
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 实现接口中的方法
public double figureArea() {
// 求圆的面积
double a = Math.PI * Math.pow(r, 2);
return a;
}
}
// 第二个算法
class Rectangle implements FigureArea {
private String name;// 名称
private double width;// 宽
private double length;// 长
// 构造方法
public Rectangle(String name, double width, double length) {
this.name = name;
this.width = width;
this.length = length;
}
// 名称 属性的读写操作
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 实现接口中的方法
public double figureArea() {
// 求矩形的面积
double area = length * width;
return area;
}
}