【架构】设计模式和它的面试题

凡事基于自己理解,过脑子才能记住,不能追求形式 流于表面

比喻法

URL类图

类之间关系

聚合和组合关系

组合和聚合的区别不是在形式上,而是在本质上

聚合关系(Aggregation)体现的是A对象可以包含B对象,但B对象不是A对象的组成部分。具体表现为,如果A由B聚合成,表现为A包含有B的全局对象但是B对象可以不在A创建的时刻创建。

A中有b实例,但是B独立存在于A,B以构造器参数传入A对象,并且执行一个方法
A消亡了但是B继续存在

组合关系(Composition):如果A由B组成,表现为A包含有B的全局对象,并且B对象在A创建的时刻创建。

组合,A和B对象 同生同死

组合


public class Person {
    private Hand hand;
 
    public Person() {
        hand=new Hand();
    }
 
    private void go(){
        hand.hand();
    }
 
    public static void main(String[] args) {
        new Person().go();//person消亡时,hand也消亡
    }
}
class Hand{
    public void hand(){
        System.out.print("hand");
    }
}

聚合

public class Person2 {
    private Computer c;
    public Person2(){
 
    }
    public Person2(Computer c){
        this.c=c;
    }
 
    public void go(){
        c.computer();
    }
 
    public static void main(String[] args) {
        Computer computer=new Computer();
        Person2 person = new Person2(computer);
        person.go();//person消亡时,不影响computer
    }
}
class Computer{
    public void computer(){
        System.out.print("computer");
    }
}

在这里插入图片描述

idea实现url类图

文章链接

设计模式的原则

开放封闭原则(Open Close Principle)

原则思想:尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化
描述:一个软件产品在生命周期内,都会发生变化,既然变化是一个既定的事实,我们就应该在设
计的时候尽量适应这些变化,以提高项目的稳定性和灵活性。
优点:单一原则告诉我们,每个类都有自己负责的职责,里氏替换原则不能破坏继承关系的体系。

里氏代换原则(Liskov Substitution Principle)

原则思想:使用的基类可以在任何地方使用继承的子类,完美的替换基类。
大概意思是:子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象方
法,但不能覆盖父类的非抽象方法,子类中可以增加自己特有的方法。
优点:增加程序的健壮性,即使增加了子类,原有的子类还可以继续运行,互不影响。

依赖倒转原则(Dependence Inversion Principle)

依赖倒置原则的核心思想是面向接口编程.
依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,
这个是开放封闭原则的基础,具体内容是:对接口编程,依赖于抽象而不依赖于具体。

接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的
意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级
和维护方便。所以上文中多次出现:降低依赖,降低耦合。
例如:支付类的接口和订单类的接口,需要把这俩个类别的接口变成俩个隔离的接口

迪米特法则(最少知道原则)(Demeter Principle)

原则思想:一个对象应当对其他对象有尽可能少地了解,简称类间解耦
大概意思就是一个类尽量减少自己对其他对象的依赖,原则是低耦合,高内聚,只有使各个模块之
间的耦合尽量的低,才能提高代码的复用率。
优点:低耦合,高内聚。
单一职责原则(Principle of single responsibility)
原则思想:一个方法只负责一件事情。
描述:单一职责原则很简单,一个方法 一个类只负责一个职责,各个职责的程序改动,不影响其
它程序。 这是常识,几乎所有程序员都会遵循这个原则。
优点:降低类和类的耦合,提高可读性,增加可维护性和可拓展性,降低可变性的风险。

常见的设计模式

9.模板方法模式

1.什么是模板方法
模板方法模式:定义一个操作中的算法骨架(父类),而将一些步骤延迟到子类中。 模板方法使
得子类可以不改变一个算法的结构来重定义该算法的
2.什么时候使用模板方法
实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分需要改变,这时候可以使用模板方
法模式,将容易变的部分抽象出来,供子类实现。
3.实际开发中应用场景哪里用到了模板方法
其实很多框架中都有用到了模板方法模式
例如:数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等
4.现实生活中的模板方法
例如:

  1. 去餐厅吃饭,餐厅给我们提供了一个模板就是:看菜单,点菜,吃饭,付款,走人 (这里 “点菜和
    付款” 是不确定的由子类来完成的,其他的则是一个模板。)
    5.代码实现模板方法模式
  2. 先定义一个模板。把模板中的点菜和付款,让子类来实现。

package com.lijie;
//模板方法 
public abstract class RestaurantTemplate {
 // 1.看菜单
  public void menu() {
   System.out.println("看菜单"); 
   }
   // 2.点菜业务 
   abstract void spotMenu(); 
   // 3.吃饭业务 
   public void havingDinner(){ 
   System.out.println("吃饭"); 
   } // 3.付款业务 
   abstract void payment();
    // 3.走人 
    public void GoR() { 
    System.out.println("走人"); 
    } //模板通用结构 
    public void process(){ 
      menu(); 
      spotMenu();
      havingDinner(); 
      payment(); 
      GoR(); 
      } 
     }

具体的模板方法子类 1

具体的模板方法子类 2

客户端测试


package com.lijie;
 public class Client { 
 public static void main(String[] args) { 
 //调用第一个模板实例 
     RestaurantTemplate restaurantTemplate = new RestaurantGinsengImpl(); restaurantTemplate.process(); 
  } 
 }

10.外观模式

1.什么是外观模式
外观模式:也叫门面模式,隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接
口。
它向现有的系统添加一个接口,用这一个接口来隐藏实际的系统的复杂性。
使用外观模式,他外部看起来就是一个接口,其实他的内部有很多复杂的接口已经被实现
2.外观模式例子
用户注册完之后,需要调用阿里短信接口、邮件接口、微信推送接口。

  1. 创建阿里短信接口

11.原型模式

1.什么是原型模式
原型设计模式简单来说就是克隆
原型表明了有一个样板实例,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实
例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。
2.原型模式的应用场景

  1. 类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。这时我们就可以通过原型拷贝
    避免这些消耗。
  2. 通过new产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。
  3. 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模
    式拷贝多个对象供调用者使用,即保护性拷贝。

3.原型模式的使用方式

  1. 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常
  2. 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此Prototype类需要将clone方法的作用域修改为public类型。
    3.1原型模式分为浅复制和深复制
  3. (浅复制)只是拷贝了基本类型的数据,而引用类型数据,只是拷贝了一份引用地址。
  4. (深复制)在计算机中开辟了一块新的内存地址用于存放复制的对象。

代码演示

创建User类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值