6.策略模式

来源:互联网 发布:各种软件logo图标 编辑:程序博客网 时间:2024/04/30 04:22

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());//输出结果
 
}
}