这部分由于时间匆忙,7中基本的设计模式,老师只讲了半个小时。下面对于几种设计模式做出自己的理解:从总接口,用户角度出发理解
1. Adapter:
客户现在只知道有一个方法叫method,method本来在class A中实现了,但是现在需要进行废弃,利用classB中的method2方法。此时就需要一个适配器,我们表面上,让客户调用我们的适配器,它调用的方法是method。但实际上我们在适配器中的method中的实现,返回的是B中的method1.从而用户最后得到的输出来自于method2。
public class EmployeeAdapter extends Consultant implements Employee{
public EmployeeAdapter(String name){
super(name);
}
@Override
public void showHappiness(){
showEmotions();
}
}
其中,employee中的方法是method,consultant中的是method1.
2. 装饰器模式:
我们目标是生成一个产品,我们产品有许多构成部分,也可以衍生出很多种类。我们把其中最基础的拿出来,作为基类。余下的形成一个接口,内部有一些方法,需要被各种不同的衍生产品实现。在生成衍生产品过程中,我们首先需要实现一个抽象装饰类。
这个抽象装饰类,需要实现接口中定义的方法,同时要有构造器。因为其他的衍生产品,也需要和其他的装饰物品搭配使用。只有我们写了构造器,才能在子类中调用父类的方法,进而让多种装饰共同出现,形成不同的衍生品。
对于客户端的使用,最重要的是对象的建立。我们根据需要的衍生品的性质的不同,声明时候采取嵌套的形式。可以重复叠加很多层,但是注意,基类只能有一个,并且一定是最内层。产生的对象调用接口中共同实现的方法,即可实现我们的产品包装。
3. visitor模式:
这种设计模式有着比较特殊的架构:
首先我们有一个基本接口,是所有产品的共同属性,例如:可被购买(accept)。
于是,我们有很多的产品,可以实现这个接口,例如book,fruit等。并且加入了自己的属性和一些自己的方法。对于accept这一方法的实现,我们在产品中并不实现(重点),而是委托给visitor这一责任方进行实现。用代码表示,就是:
public int accept(ShoppingCartVisitor visitor) {
return visitor.visit(this);
}
this表示的是这整个book的引用。我们将这个accept的实现转交给了visitor下的visit方法。所以现在我们需要创建visitor所属于的类。
这个类的实现非常简单,有什么产品需要被visit,就写几个visit方法。
这个接口只是起到承上启下的作用,编程更加规范。
对于这里的visit,我们需要编写实现类。并且对于visit进行重写。实现的是具体方法,比如买多少,打几折等,如下:
@Override
public int visit(Book book) {
double cost = 0;
if(book.getPrice()>10){
cost = book.getPrice() -5;
}
else {
cost = book.getPrice();
}
System.out.println(book.getBookName() + "'s price is " + cost);
return (int)cost;
}
最终客户的调用,一定是从最初的基本接口itemelement开始调用 ,否则会报错!
package visitor;
public class ShoppingCartClient {
public static void main(String[] args){
ItemElement[] items = new ItemElement[]{
new Book(20,"math"), new Fruit(100, 2),new Book(6, "white night")
};
int total = calculateTotal(items);
System.out.println("Total cost: " + total);
}
private static int calculateTotal(ItemElement[] items) {
ShoppingCartVisitor visitor = new ShoppingCartImpl();
int sum = 0;
for(ItemElement item:items){
sum = sum + item.accept(visitor);
}
return sum;
}
}
以上就是对常见的三种设计模式的讲解,考试常考!