package 策略模式;
abstract class Strategy{//抽象策略类
public abstract void AlgorithmInterface();
}
class ConcreteStrategyA extends Strategy{//具体算法A
public void AlgorithmInterface(){//算法A的实现方法
System.out.println("算法A的实现");
}
}
class ConcreteStrategyB extends Strategy{//具体算法B
public void AlgorithmInterface(){//算法B的实现方法
System.out.println("算法B的实现");
}
}
class ConcreteStrategyC extends Strategy{//具体算法C
public void AlgorithmInterface(){//算法C的实现方法
System.out.println("算法C的实现");
}
}
class Context{//上下文类
private Strategy strategy;
public Context(Strategy strategy){//初始化时,传入具体的策略对象
this.strategy=strategy;
}
public void ContextInterface(){//根据具体的策略对象,调用其算法的方法
strategy.AlgorithmInterface();
}
}
public class TestClass {
public static void main(String [] args){
Context context;
context =new Context(new ConcreteStrategyA());
context.ContextInterface();
context =new Context(new ConcreteStrategyB());
context.ContextInterface();
context =new Context(new ConcreteStrategyC());
context.ContextInterface();
}
}
package 策略模式;
//GOOD:定义算法家族,分别封装起来,让它们之间可以互相替换,让算法变化,不会影响到用户
//BUG:客户端要做出判断
import java.util.Scanner;
class Operation//运算类
{
protected double m=0;
protected double n=0;
public void setNum(double m,double n){
this.m=m;
this.n=n;
}
public double GetResult()
{
double d=0;
return d;
}
}
class AddOperation extends Operation//加法类
{
public double GetResult()
{
return m+n;
}
}
class SubOperation extends Operation//减法类
{
public double GetResult()
{
return m-n;
}
}
class MulOperation extends Operation//乘法类
{
public double GetResult()
{
return m*n;
}
}
class DivOperation extends Operation//除法类
{
public double GetResult()
{
if(n==0)System.out.println("除数不能为0");
return m/n;
}
}
class Context{//上下文类
private Operation oper;
public Context(Operation oper){
this.oper=oper;
}
//上下文接口
public double ContexInterface(){
return oper.GetResult();
}
}
public class TestClass {
public static void main(String [] args){
Context con=null;
Scanner scanner = new Scanner(System.in); //创建针对标准输入流的扫描器
char c=(scanner.next()).charAt(0);//输入一个字符
double a = scanner.nextDouble(); //从扫描器上读取一个整数
double b = scanner.nextDouble(); //从扫描器上读取一个整数
Operation oper;
switch(c){//弊端在于客户端要做出判断
case '+' :
oper=new AddOperation();
oper.setNum(a, b);
con=new Context(oper);
break;
case '-' :
oper=new SubOperation();
oper.setNum(a, b);
con=new Context(oper);
break;
case '*' :
oper=new MulOperation();
oper.setNum(a, b);
con=new Context(oper);
break;
case '/' :
oper=new DivOperation();
oper.setNum(a, b);
con=new Context(oper);
break;
}
System.out.println(con.ContexInterface());//输出结果
}
}
package 策略与简单工厂结合;
import java.util.Scanner;
class Operation//运算类
{
protected double m=0;
protected double n=0;
public void setNum(double m,double n){
this.m=m;
this.n=n;
}
public double GetResult()
{
double d=0;
return d;
}
}
class AddOperation extends Operation//加法类
{
public double GetResult()
{
return m+n;
}
}
class SubOperation extends Operation//减法类
{
public double GetResult()
{
return m-n;
}
}
class MulOperation extends Operation//乘法类
{
public double GetResult()
{
return m*n;
}
}
class DivOperation extends Operation//除法类
{
public double GetResult()
{
if(n==0)System.out.println("除数不能为0");
return m/n;
}
}
class Context{//上下文类
private Operation oper;
public Context(char c,double a,double b){
switch(c){//策略与简单工厂结合
case '+' :
oper=new AddOperation();
oper.setNum(a, b);
break;
case '-' :
oper=new SubOperation();
oper.setNum(a, b);
break;
case '*' :
oper=new MulOperation();
oper.setNum(a, b);
break;
case '/' :
oper=new DivOperation();
oper.setNum(a, b);
break;
}
}
//上下文接口
public double ContexInterface(){
return oper.GetResult();
}
}
public class TestClass {
public static void main(String [] args){
Scanner scanner = new Scanner(System.in); //创建针对标准输入流的扫描器
char c=(scanner.next()).charAt(0);//输入一个字符
double a = scanner.nextDouble(); //从扫描器上读取一个整数
double b = scanner.nextDouble(); //从扫描器上读取一个整数
Context con =new Context('+',2,5);
System.out.println(con.ContexInterface());//输出结果
}
}