小匠杨解读策略模式

导读

可以这么说,所有的设计模式都是对于编程中的某一类问题的解决方案。在大多数人眼里或许设计模式非常的难,但其实它只是一种有着固定边界、确定的方案而已,当经过多次的使用,慢慢的熟练了你就不会觉得它有这么难了,到那时你会觉得它真的简单、真的强大。

是什么

策略模式是一种编程的思想,某类问题的解决方案,它可以解决我们在编程中遇到的一些特定的问题,策略即在处理一件事情的时候,不同的情况会有不同的处理方法,不同的处理方法就是不同的策略,常见的一个例子就是我们日常生活中的出行方式的选择,汽车、公交车、地铁,同样是选出行方式,不同的情形下就会有不同的选择方式。

为什么

明白了是什么,那么我们就需要知道它为什么会出现,在我们的编程中,通常都会有这样的情景,某件事的完成(某个功能的完成)在不同的条件下会有不同的处理过程,在编程中常见的就是if else…等的判断,但这种多if的判断会使得代码变的非常的难维护和功能的拓展,正是为了解决这种多条件下的不同处理方法才出现了策略模式,我们可以将处理方法放在一个抽象的接口中,具体的实现方式由子类来确定,每一个不同的处理都在它的子类中实现,具体的执行方法在执行中动态确定(传入哪个子类就执行哪个子类的方法),这样就可以避免多if判断,对于程序功能的拓展,代码的维护也就相对的容易了许多。

UML类图

在这里插入图片描述

Context

中文描述为上下文,其实只是一个名字而已,不用过多的对概念进行死磕,可以这么理解,在出行方式选择的例子中,它就是我们,就是一个人,它里面维护着策略对象,选择出行方式是它的一个方法,方法里的具体实现即通过维护的策略对象调用具体的策略方法。再比如我们去商场中结账台的结账,有时候打三折、有时候会有满减,这时候的Context就可以理解为结账台这个东东,它维护着一个结账方式的策略对象,它的结账功能就是通过调结账方式维护的策略对象的具体策略方法来实现。

Strategy

抽象的策略对象,它是一个接口,声明了一个具体的策略方法。

ConcreteStategy

具体的策略对象,是对抽象策略方法的具体实现类。

一个代码示例

// 上下文对象
public class TrafficContext {
    private TrafficSuper trafficSuper;
  
    public TrafficSuper(TrafficSuper trafficSuper) {
        this.trafficSuper= trafficSuper;
    }
     
    public String getResult(int   i) {
         return trafficSuper.getTraffic(i);
     }

 }
//策略接口
 public interface TrafficSuper{    
    public String getTraffic(int  i);
 }

//具体的策略实现类
public class Car implement TrafficSuper{

   @Override
   public String getTraffic(int  i) {
        return "car";
   }
 }
 
public class  BiCycle  implements TrafficSuper{

   @Override
   public String getTraffic(int  i) {
        return "bicycle";
   }
 }

//客户端
public class Client {
     public static void main(String[] args) {
        TrafficContext trafficContext = null;
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入出行方式(1/2):");
        int in = scanner.nextInt();
        String type = "";
       
	    switch (in) {
	         case 1:
	              trafficContext = new TrafficContext (new Car());
	              type += "汽车";
	              break;
	              
	          case 2:
	              trafficContext = new TrafficContext (new BiCycle());
	              type += "自行车";
	              break;
	            default:
	              System.out.println("请输入1/2");
	              break;
	      } 
      System.out.println("出行方式:" + type);  
      scanner.close();
    }
 }

小注意点

  1. 策略模式会使类变多,每一种策略都是一个类。
  2. 具体的使用应该要看具体的项目场景,不是说每个项目在设计时都要尽可能的使用各种设计模式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值