首页 > 解决方案 > java有界泛型与策略模式之间的区别

问题描述

我有一个与接口 Isupplier 耦合的 util 类。

班级Util<T extends Isupplier>

它有一个方法 execute,它有一个实现 Isupplier 的对象列表。

execute(List<T extends Isupplier> objList )

有一些类实现了 Isupplier 中的方法。还有一个调用者类,它为每个实现类调用execute方法。

Class A implements Isupplier

Class B implements Isupplier

 Class ACaller{
 //calls Util.execute(List of Object A)`
}
 Class BCaller{
 //calls Util.execute(List of Object B)`
}

这可以称为策略模式的使用吗?因为我们正在对接口进行编码。该策略可以是Isupplier的实施。作为供应商的基本战略。上下文作为 Util?

标签: javagenericsdesign-patternsgeneric-programmingstrategy-pattern

解决方案


您在示例中的案例看起来Decorator Pattern 比策略模式更多。

为了确定两者之间的区别,我向您推荐一个好的来源(不要认为我不知道自己的想法,但维基百科是一个很好的有信誉的来源);

我实际上已将您的案例转化为实际运行的代码,如下所示。我还将尝试澄清为什么这不是策略模式。

ISupplier.java:
public interface ISupplier {
  void supply() ;
}

A.java
public class A implements ISupplier {

    private String name = null ;
    public A(String supplierName) {
         name = supplierName;
     }
    public  void supply() {
        System.out.println( name+ " Supplies from China!" );
     }
}


Util.java
import java.util.*;
public class Util <T extends ISupplier> {

 public  void supply() {
    System.out.println( " Util Context!" );
 }
 
 public void execute(List<ISupplier> objList ) {
     for (ISupplier supplier : objList) {
         supplier.supply();
     }
 }
}

ACaller.java
import java.util.*;

public class ACaller {

    Util util =  null;

    List<A> listOfA = null;
    
    public ACaller(Util ut) {
        util = ut;
    }
    
    public void fillListA() {
        listOfA = new ArrayList<A>();
        
        listOfA.add(new A("A-1"));
        listOfA.add(new A("A-2"));
    }
    public void run()  {

        util.execute(listOfA);
    }
    
    public static void main(String[] args) {

        Util strategy1 = new Util();
        ACaller ac = new ACaller(strategy1);
        
        ac.fillListA();
        
        ac.run();
        
    }
}

当您运行此代码时;你会得到:

 $ java ACaller 
 A-1 Supplies from China!
 A-2 Supplies from China!

Util 类没有提供任何收益,而是充当调用者和供应商之间的另一个静态中介。

在实际运行的策略模式中,我们希望 Context (Util) 为解决方案动态提供不同的 supply() 方法..

换句话说,我们没有办法Util 类中提供 supply() 方法的动态实现。

简而言之,您的案例似乎更接近装饰者模式,而不是策略模式,因此不是策略模式。

请注意,两种模式都使用接口,所以仅仅因为您正在写入接口,并不意味着......

干杯


推荐阅读