2017-09-15 49 views
0

我正在阅读Head First Design Pattern这本书,而我遇到的第一个设计模式是策略设计模式。我发现它很容易理解和实现,但在实现时,我面临着一个问题,我不知道我们怎么称之为“行为类的参数化构造器”。策略设计模式:行为类的调用构造函数

从书上的快照:

enter image description here

我在这里谈论如何调用FlyWithWings, Quack etc类的构造函数。

我会给Strategy设计模式的一个例子来理解它在一个更好的办法:

//Strategy Interface 
public interface CompressionStrategy { 
    public void compressFiles(ArrayList<File> files); 
} 

public class ZipCompressionStrategy implements CompressionStrategy { 
public void compressFiles(ArrayList<File> files) { 
    //using ZIP approach 
    } 
} 
public class RarCompressionStrategy implements CompressionStrategy { 
public void compressFiles(ArrayList<File> files) { 
    //using RAR approach 
    } 
} 
public class CompressionContext { 
private CompressionStrategy strategy; 
    //this can be set at runtime by the application preferences 
    public void setCompressionStrategy(CompressionStrategy strategy) { 
    this.strategy = strategy; 
    } 

    //use the strategy 
    public void createArchive(ArrayList<File> files) { 
    strategy.compressFiles(files); 
    } 
} 

public class Client { 
    public static void main(String[] args) { 
    CompressionContext ctx = new CompressionContext(); 
    //we could assume context is already set by preferences 
    ctx.setCompressionStrategy(new ZipCompressionStrategy()); 
    //get a list of files... 
    ctx.createArchive(fileList); 
    } 
} 

所以在上面的例子中RarCompressionStrategyZipCompressionStrategy是行为类。那么是否可以从CompressionContext类中触发这些行为类的参数化构造类?

+2

我没有看到一个参数的构造函数。 –

+0

@LucianovanderVeekens这只是一个例子,我问我们是否有参数化的构造函数,然后如何调用它? – arqam

+1

'ctx.setCompressionStrategy(new ZipCompressionStrategy(someImaginaryParam));' – Fildor

回答

2
public class ZipCompressionStrategy implements CompressionStrategy { 
    public ZipCompressionStrategy (String param1, String param2) { 
     // do something 
    } 
    public void compressFiles(ArrayList<File> files) { 
     //using ZIP approach 
    } 
} 
public class RarCompressionStrategy implements CompressionStrategy { 
public void compressFiles(ArrayList<File> files) { 
    //using RAR approach 
    } 
} 

然后

ctx.setCompressionStrategy(new ZipCompressionStrategy(param1, param2)) //with params 
ctx.setCompressionStrategy(new RarCompressionStrategy()) //without params