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



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中经常用(核心框架);
场景描述:胡总请客户去吃饭,饭店前台要结账,找秘书周密,周可以再这个胡总的支付方法前面和后面加上自己的方法,清点和饭店优惠;但是大家不知道有秘书的存在,只知道胡总请客吃饭的;


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值