##1,策略模式
优点:利用接口的多态,将接口作为参数传入,可以实现多种对象的传入。
缺点:需要有实现接口的多个策略类
##2,代理模式
优点:可以生成多种功能的对象,比单纯只采用继承的方法更加的简单灵活
缺点:增加了许多子类,如果过度使用会使得程序变得很复杂
实例代码:
public class Food {
private String food_name;
public Food() { }
public Food(String food_name) {
this.food_name = food_name;
}
public String make() {
return food_name;
};
}
//面包类
public class Bread extends Food {
private Food basic_food;
public Bread(Food basic_food) {
this.basic_food = basic_food;
}
public String make() {
return basic_food.make()+"+面包";
}
}
//奶油类
public class Cream extends Food {
private Food basic_food;
public Cream(Food basic_food) {
this.basic_food = basic_food;
}
public String make() {
return basic_food.make()+"+奶油";
}
}
//蔬菜类
public class Vegetable extends Food {
private Food basic_food;
public Vegetable(Food basic_food) {
this.basic_food = basic_food;
}
public String make() {
return basic_food.make()+"+蔬菜";
}
}
public class Test {
public static void main(String[] args) {
Food food = new Bread(new Vegetable(new Cream(new Food("香肠"))));
System.out.println(food.make());
}
}
##代理模式
1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.
2.缺点:
因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.
如何解决静态代理中的缺点呢?答案是可以使用动态代理方式
/**
* 接口
*/
public interface IUserDao {
void save();
}
/**
* 接口实现
* 目标对象
*/
public class UserDao implements IUserDao {
public void save() {
System.out.println("----已经保存数据!----");
}
}
/**
* 代理对象,静态代理
*/
public class UserDaoProxy implements IUserDao{
//接收保存目标对象
private IUserDao target;
public UserDaoProxy(IUserDao target){
this.target=target;
}
public void save() {
System.out.println("开始事务...");
target.save();//执行目标对象的方法
System.out.println("提交事务...");
}
}
/**
* 测试类
*/
public class App {
public static void main(String[] args) {
//目标对象
UserDao target = new UserDao();
//代理对象,把目标对象传给代理对象,建立代理关系
UserDaoProxy proxy = new UserDaoProxy(target);
proxy.save();//执行的是代理的方法
}
}
1.简单工厂模式:将业务逻辑部分和界面逻辑部分分离开来,降低了业务逻辑部分和界面逻辑部分的耦合度,符合面向对象的迪米特法则。
2.工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到了子类。
3.抽象工厂模式;提供一个创建一系列相关或者相互依赖的对象的接口,而无需指定他们具体的类。
4.职责链设计模式(chain of responsibility):使多个对象都有处理请求的机会,从而避免了请求的发送者和接受者之间的耦合关系,将所有的处理对象连成一条链,
并沿着这条链传递请求,直到有一个对象能够处理它为止。
5.单身设计模式:(singleton);保证一个类仅仅有一个实例,并提供一个访问他的全局访问点,通常我们可以让一个全局变量使得一个对象被访问,但他不能防止你
实例化多个对象,一个最好的方法就是,让类自身保护它唯一的实例,这个类可以保证它没有其他的实例被创建,并且它可以提供一个访问该实例的方法。
6.适配器设计模式:(Adapter):讲一个;类的接口转化为客户希望的另一个接口,Adapter模式使得原来接口不兼容而不能一起工作的那些类可以一起工作了。
7.装饰设计模式:(Decorator):动态地给一个对象添加一些额外的职责。即增加功能来说,装饰模式比生成子类更为灵活。
8.代理模式:(Proxy):为其他对象提供一种代理以达到控制这个对象的访问。
9.观察者设计模式:又称发布–订阅模式,定义了一个一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的
观察者对象,使他们能够自动的进行更新。
10.状态设计模式:当一个对象的内在状态发生改变时允许改变其行为,这个对象看起来像是改变了类,状态模式主要解决的是当控制一个对象转换的条件表达式过于复杂的
情况。把状态的判断逻辑转移到表示不同状态的的一系列的类中,可以把复杂的逻辑简化。好处是将特定状态的相关行为局部化,且将不同状态的行为分割开来。
11.命令设计模式:命令设计模式的作用是将一个请求封装成一个对象,从而使我们可以用不同的请求对象进行参数化,对请求排队或者是请求记录日志,以及支持科撤销的
操作,命令模式将调用操作的请求对象与知道如何实现改操作的接受对象解耦,
12.模板设计模式:定义一个算法骨架,而且将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义算法的特定步骤。
13桥接设计模式;将抽象部分与它的现实部分想分离,使它们可以独立的变化,桥接设计模式可以避免“类爆炸”的情况
14.策略设计模式:定义了一个算法家庭,分别把他们都封装起来,让他们之间可以相互替换,这些算法的替换变化不会影响到使用算法的客户。
15组合设计模式;将对象组合成树的结构以表示“部分–与整体”的的层次结构,组合模式使得单个用户对单个对象的使用具有一致性。
16.原型设计模式:用原型的实例指定创建类的总类,并且通过拷贝这个原型来创建的新的对象。