1.设计模式的概念
设计模式是一套被反复使用,大多数人知晓的,经过分类编目的,代码设计经验的总结。它描述了在软件设计过程中一些不断重复发生的问题,以及该问题的解决方案。也就是说它是解决特定问题的一系列套路,是前辈们代码设计经验的总结,具有一定的普遍性,可以反复使用,其目的是为了提高代码的可重用性,可读性,可靠性。
2.学习设计模式的意义
可以提高程序员的思维能力,编程能力和设计能力。
使程序设计更加标准化,代码编制更加工程化,使软件开发效率大大提高,从而缩短开发周期。
使设计的代码可重用性高,可读行强,可靠性高,灵活性好,可维护性强。
当然,软件设计模式只是一个引导,在具体的软件开发过程中,必须根据设计的应用系统特定和要求来恰当的选择。对于简单的程序开发,若能写一个简单的算法要比引入某种设计模式更加容易。但对大项目的开发或框架设计,使用设计模式来组织代码显然更好。
3.设计模式分类
总体来说设计23种模式可以分为三大类
创建型模式:共五种,单例模式,抽象工厂模式,工厂模式,建造者模式,原型模式。
结构型模式:共七种,组合模式,外观模式,代理模式,装饰模式,适配器模式,桥接模式,享元模式。
行为型模式:共十一种,迭代模式,观察者模式,模板方法模式,命令模式,状态模式,策略模式,责任链模式,中介者模式,访问者模式,解释器模式,备忘录模式。
设计原则:
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要的代码混在一起。(封装变化)
针对接口编程,而不是针对实现编程。
多用组合,少用继承。
模式分析:
策略模式:
策略模式定义了一组行为(算法),分别封装起来,让它们之间可以互相替换,此模式让行为(算法)的变化独立于使用它们的客户。
代理模式:
代理模式(proxy)属于结构性设计模式,为其它对象提供一种代理以控制对这个对象的访问,这样做到好处是可以在目标对象实现的基础上增强额外的功能,即扩展目标对象的功能。
扩展对象功能可以使用继承或组合,使用继承扩展对象功能有以下确定:不便于维护,假如有100个目标类要扩展功能就要写100个继承类来实现。如果目标类是使用final修饰符来修饰的则不能使用继承。所以可以考虑使用组合来实现目标对象功能的扩展。代理模式就利用了组合,代理对象里组合了目标对象,代理对象是对目标对象的扩展并会调用目标对象。
代理模式可以分为三类:静态代理,动态代理,cglib代理
静态代理:静态代理在使用时,需要定义接口或者父类,被代理的对象与代理对象一起实现相同的接口或继承相同的父类,
然后通过调用相同的方法来调用目标对象的方法。下面举个实例说明:
接口:IUser.java
public interface IUser{
void run();
}
实现类:User.java
public class User implements IUser{
public void run(){
System.out.printle("奔跑吧,少年");
}
}
代理类:UserProxy.java
public class UserProxy implements IUser{
private IUser user;
public UserProxy(Iuser user){
this.user=user;
}
public void run(){
System.out.printle("跑步前热身");//在调用目标对象方法前后添加一些功能
user.run();
System.out.printle("跑步后洗澡");
}
}
测试类:Test.java
public class TestProxy{
public void static main(String[] args){
User user = new User();
UserProxy proxy = new UserProxy(user);//把目标对象传给代理对象,建立代理关系
proxy.run();
}
}
静态代理总结:
1.面向对象的核心原则是OCP,即开放封闭原则,对扩展开放,对修改关闭。静态代理符合这一原则,可以在不修改目标对象的情况下对目标功能进行扩展
2缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多。
如何解决静态代理中的缺点呢,答案就是使用动态代理
(持续更新。。。)