1.代理模式
为主要的功能增加旁支末节的功能
public interface OperDb {
void insert();
void query();
void delete();
void update();
}
class OperDbImpl implements OperDb{
@Override
public void insert() {
System.out.println("-----insert-------");
}
@Override
public void query() {
System.out.println("-----query-------");
}
@Override
public void delete() {
System.out.println("-----delete-------");
}
@Override
public void update() {
System.out.println("-----update-------");
}
}
class OperDbProxyForLog implements OperDb{
private OperDb operDb;
public OperDbProxyForLog(OperDb operDb){
this.operDb = operDb;
}
@Override
public void insert() {
System.out.println("-----insert log-------");
operDb.insert();
}
@Override
public void query() {
System.out.println("-----query log-------");
operDb.insert();
}
@Override
public void delete() {
System.out.println("-----delete log-------");
operDb.insert();
}
@Override
public void update() {
System.out.println("-----update log-------");
operDb.insert();
}
public static void main(String[] args) {
OperDb operDb = new OperDbProxyForLog(new OperDbImpl());
operDb.insert();
operDb.delete();
}
}
2.装饰者模式
为主要的功能增加主要功能
import java.math.BigDecimal;
public abstract class Drink {
String desc = "unknow drink";
public String getDesc() {
return desc;
}
public abstract BigDecimal cast();
}
class Coffee extends Drink{
Coffee(){
desc = "coffee";
}
@Override
public BigDecimal cast() {
return new BigDecimal("3.00");
}
}
abstract class Seasoning extends Drink{
public abstract String getDesc();
}
class Sugar extends Seasoning{
private Drink drink;
Sugar(Drink drink){
this.drink = drink;
}
@Override
public BigDecimal cast() {
return drink.cast().add(new BigDecimal("0.23"));
}
@Override
public String getDesc() {
return drink.getDesc()+ ".sugar";
}
public static void main(String[] args) {
Drink drink = new Sugar(new Coffee());
System.out.println(drink.cast());
System.out.println(drink.getDesc());
}
}
二者的差别:
1)相同点:都是为功能做拓展,都能保证原始类不做修改的前提下做功能拓展。(满足设计模式的开闭原则)
2)不同点:代理模式增加的是不重要的功能,装饰者模式增加的是主要功能