您的位置:首页 > 其它

常用设计模式详解,附设计系统思路图

2016-12-08 23:18 211 查看


UML语言:

补 充:spring带来了面向切面编程,在属性和行为中切一些代理方法或者属性进去;是对面向对象编程的有益补充;

设计7原则:

1、开闭原则:软件对扩展是开放的,对修改是关闭的;【这是一个纲领性原则,最后要达到的结果就是强内聚,少耦合;】

2、单一职责原则:每一个对象都有一个单独的职责(一个职责不是一个方法)【案例】:一个方法要操作流程,则流程发生改变就要改变方法;当方法只实现功能,就不会被改变;通过RUN方法来进行流程控制;

3、DRY : 聚合组合原则,抽取公共部分放置在一个地方避免代码重复;

4、LSP:里氏替换原则,子类必须能够替换父类;

5、DIP:依赖倒置原则,高层模块不应该依赖于底层模块,二者都应该依赖于抽象; 抽象不应该依赖于细节,细节应该依赖于抽象;【在设计接口或者调用方法的时候依赖抽象而不是具体的方法;】

6、ISP:接口隔离原则,不应该强迫客户程序依赖它们不需要的使用的方法;

7、最小接口原则:尽可能设置最少的接口(将可以合并的接口合并起来形成新的接口);

1、架构模式

1、三层架构: 表现层--业务层--持久层; (贫血型-对象的属性和行为相分离);

2、视图的VCM模型:

2、设计模式:按照干什么来进行分类

1、创建模式:涉及对象的创建

单例模式@、工厂模式@、建造者模式、原型模式@;

2、结构模式:设计类和对象的组合

Facade外观模式、代理模式,适配器模式,装饰器模式-星巴克咖啡@;

3、行为模式:刻画了类和对象交换及分配职责的方式,目标是解耦;

观察者模式,命令模式,模板模式;
2.1 单例模式(Singleton):
第一种:预加载方式懒汉模式

1,构造方法私有化, 将自己在自己内部实例化一个对象作为自己的属性,使用一个方法将这个对象作为返回值返出去;

特点:1、该对象就算不用,也要在内存中产生出来;

2、线程绝对安全;

代码示例:

public class Singleton {

// private static Singleton sin = new Singleton();

// private Singleton(){

// }

// public static Singleton getInstance(){

// return sin;

// }

第二种:饿汉模式:

如果静态成员变量sin == null 则 重新new一个对象出来;否则就直接返回sin已经new出来的对象;

特点: 1、延迟加载时间,在真正需要用的时候才用;

2、不加同步线程不安全的;加同步效率就低;(synchronize);

代码示例:

public class Singleton {

// private static Singleton sin;

// private Singleton(){

// }

// public synchronized static Singleton getInstance(){

// if(sin == null){

// sin = new Singleton();

// }

// return sin;

// }
第三种:双锁模式:外面的if,可以避免所有代码进同步块,只有非第一次才进来判断、第二个IF避免切程序,导致new出两个对象;

特点:1、即实现高并发,又实现同步安全; 2、同时实现延迟加载;

代码示例:

public class Singleton {

private static Singleton sin;

private Singleton(){

}

public static Singleton getInstance(){

if(sin == null){

synchronized(Singleton.class){

if(sin == null){

sin = new Singleton();

}

}

}

return sin;

}

}
2.2工厂模式:

DButil,中的JDBC链接对象,中专门产生对象,其他人来使用它;

好处:1、客户类和工厂类分开,消费者任何时候需要某种产品只需向工厂请求即可;
第一种:简单工厂模式:一个工厂生产多个产品,【案例】:肯德基后台生产,前台按需取用;

代码示例:源代码(设计模式-KFC工厂)

服务员,点餐传入,根据点餐对应的进入相应的产品回应;所有产品继承产品接口实现产品描述和产品获取行为;

第二种:工厂方法模式:工厂发生变化,同样的产品不同的工厂出来的有不同的效果,汉堡(肯德基、麦当劳、汉堡王) 抽象一个快餐店,都有各自实现汉堡的方法;

代码示例:

第三种:抽象工厂方法:工厂能抽象出来,产品也可以抽象出来;

2.3原型模式(prototype):创建一个和已有的模型一模一样的新对象,Clone;

第一种:浅克隆模型:

克隆,重写对象的clone()方法的访问修饰符为public; 不一定改变; 重写对象要实现Cloneable 标识接口;

特征:未实现引用的克隆;

代码实现:

•public class AbstractSpoon implements Cloneable

{

  String spoonName;

  public void setSpoonName(String spoonName) {this.spoonName = spoonName;}

  public String getSpoonName() {return this.spoonName;}

  public Object clone()

  {

    Object object = null;

    try {

      object = super.clone();

    } catch (CloneNotSupportedException exception) {

      System.err.println("AbstractSpoon is not Cloneable");

    }

    return object;

  }

}

第二种:深克隆模型1:

在克隆对象重写的克隆方法中,对引用对象的技巧属性指向新克隆的对象,

第三种:深克隆模型1:

通过序列化中间加byteArrayOutPutStream的字节处理流再输入回来,就可以了;通过这个管道的toByteArray()实现; 且都要实现标记接口;

代码实现:
•public Man deepClone(){
try {
–ByteArrayOutputStream bo = new ByteArrayOutputStream();
–ObjectOutputStream outObj = new ObjectOutputStream(bo);
–outObj.writeObject(this);

–ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
–ObjectInputStream outIn = new ObjectInputStream(bi);
–Man m = (Man)outIn.readObject();

–return m;
•} catch (Exception e) {
•e.printStackTrace();
•}
•return null;
•}
2.4外观模式:【案例】:照相机的一键模式,ATM机的run方法;只需调用run方法,就可以实现复杂的过程; 给客户一个选择菜单,自己选择调用那个方法那个功能;

类似菜单选择;
2.5装饰器模式:如何避免一个父类的子类太多,造成的子类膨胀爆炸问题;--星巴克咖啡;

关键点: 主要内容必须有主次之分才能实现;

实现过程:通过聚合和组合解决了继承的类爆炸问题;

代码实现:

2.6桥梁模式:当内容没有主次之分的时候使用桥梁模式;

实现过程:在应对多维度的变化中抽取出变化的两个关键点, 然后各自写各自的接口,然后把动作作为属性的一个属性,将所需要的动作传给属性类;

代码实现:

2.7适配器模式:往往在调用别人的方法的时候,别人提供的不匹配我们的使用,中间需要加一个适配器;

实现过程:1、继承一个,添加一个属性;

2、添加两个属性; 代码在创建对象中最后几页

2.8代理模式(Proxy):帮助实现面向对象编程的面向方向编程;Spring中经常用(核心框架);

场景描述:胡总请客户去吃饭,饭店前台要结账,找秘书周密,周可以再这个胡总的支付方法前面和后面加上自己的方法,清点和饭店优惠;但是大家不知道有秘书的存在,只知道胡总请客吃饭的;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: