说说我自己吧,应届生一枚,大专学历,软件专业,在学校也学得不怎么样,刚开始出来找工作很不容易,万幸的是,还是有公司要我了。进公司也快一个月了,明天就是国庆长假了,趁着自己有时间,写点博客,记录下自己的学习经历,希望能够帮助到别人。

单例模式
简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。单例模式实现起来也很容易,直接看demo吧

public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {singleton = new Singleton();}return singleton;}
}

按照我的习惯,我恨不得写满注释,怕你们看不懂,但是这个代码实在太简单了,所以我没写任何注释,如果这几行代码你都看不明白的话,那你可以洗洗睡了,等你睡醒了再来看我的博客说不定能看懂。

观察者模式
对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。Android中的各种Listener就使用到了这一设计模式,只要用户对手机进行操作,对应的listener就会被通知,并作出响应的处理。

看不懂图的人端着小板凳到这里来,给你举个栗子��:假设有三个人,小美(女,28),老王和老李。小美很漂亮,很风骚,老王和老李是两个中年男屌丝,时刻关注着小美的一举一动。有一天,小美说了一句:我老公今天不在家,一个人好无聊啊~~~,这句话被老王和老李听到了,结果乐坏了,蹭蹭蹭,没一会儿,老王就冲到小美家门口了,于是进门了……………………..帕~啪啪啪啪啪~
在这里,小美是被观察者,老王和老李是观察者,被观察者发出一条信息,然后被观察者进行相应的处理,看代码:

public interface Person {//老王和老李通过这个接口可以接收到小美发过来的消息void getMessage(String s);
}

这个接口相当于老王和老李的电话号码,小美发送通知的时候就会拨打getMessage这个电话,拨打电话就是调用接口,看不懂没关系,先往下看

public class LaoWang implements Person {private String name = "老王";public LaoWang() {}@Overridepublic void getMessage(String s) {System.out.println(name + "接到了小美打过来的电话,电话内容是:" + s);}}public class LaoLi implements Person {private String name = "老李";public LaoLi() {}@Overridepublic void getMessage(String s) {System.out.println(name + "接到了小美打过来的电话,电话内容是:->" + s);}}

代码很简单,我们再看看小美的代码:

public class XiaoMei {List<Person> list = new ArrayList<Person>();public XiaoMei(){}public void addPerson(Person person){list.add(person);}//遍历list,把自己的通知发送给所有暗恋自己的人public void notifyPerson() {for(Person person:list){person.getMessage("今天家里就我一个人,你们过来吧,谁先过来谁就能得到我!");}}
}

我们写一个测试类来看一下结果对不对

public class Test {public static void main(String[] args) {XiaoMei xiao_mei = new XiaoMei();LaoWang lao_wang = new LaoWang();LaoLi lao_li = new LaoLi();//老王和老李在小美那里都注册了一下xiao_mei.addPerson(lao_wang);xiao_mei.addPerson(lao_li);//小美向老王和老李发送通知xiao_mei.notifyPerson();}
}

运行结果我截图了

完美~~~

装饰者模式
对已有的业务逻辑进一步的封装,使其增加额外的功能,如java中的IO流就使用了装饰者模式,用户在使用的时候,可以任意组装,达到自己想要的效果。
举个栗子,我想吃三明治,首先我需要一根大大的香肠,我喜欢吃奶油,在香肠上面加一点奶油,再放一点蔬菜,最后再用两片面包加一下,很丰盛的一顿午饭,营养又健康,那我们应该怎么来写代码呢?
首先,我们需要写一个Food类,让其他所有食物都来继承这个类,看代码:

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()+"+蔬菜";}}

这几个类都是差不多的,构造方法传入一个Food类型的参数,然后在make方法中加入一些自己的逻辑,如果你还是看不懂为什么这么写,不急,你看看我的Test类是怎么写的,一看你就明白了

public class Test {public static void main(String[] args) {Food food = new Bread(new Vegetable(new Cream(new Food("香肠"))));System.out.println(food.make());}
}

看到没有,一层一层封装,我没从里往外看:最里面我new了一个香肠,在香肠的外面我包裹了一层奶油,在奶油的外面我又加了一层蔬菜,最外面我放的是面包,是不是很形象,哈哈�� 这个设计模式简直跟现实生活中一摸一样,看懂了吗?
我们看看运行结果吧

一个三明治就做好了~~~

适配器模式
将两种完全不同的事物联系到一起,就像现实生活中的变压器。假设一个手机充电器需要的电压是20V,但是正常的电压是220V,这时候就需要一个变压器,将220V的电压转换成20V的电压,这样,变压器就将20V的电压和手机联系起来了。

public class Test {public static void main(String[] args) {Phone phone = new Phone();VoltageAdapter adapter = new VoltageAdapter();phone.setAdapter(adapter);phone.charge();}
}// 手机类
class Phone {public static final int V = 220;// 正常电压220v,是一个常量private VoltageAdapter adapter;// 充电public void charge() {adapter.changeVoltage();}public void setAdapter(VoltageAdapter adapter) {this.adapter = adapter;}
}// 变压器
class VoltageAdapter {// 改变电压的功能public void changeVoltage() {System.out.println("正在充电...");System.out.println("原始电压:" + Phone.V + "V");System.out.println("经过变压器转换之后的电压:" + (Phone.V - 200) + "V");}
}

工厂模式
简单工厂模式:一个抽象的接口,多个抽象接口的实现类,一个工厂类,用来实例化抽象的接口

// 抽象产品类
abstract class Car {public void run();public void stop();
}// 具体实现类
class Benz implements Car {public void run() {System.out.println("Benz开始启动了。。。。。");}public void stop() {System.out.println("Benz停车了。。。。。");}
}class Ford implements Car {public void run() {System.out.println("Ford开始启动了。。。");}public void stop() {System.out.println("Ford停车了。。。。");}
}// 工厂类
class Factory {public static Car getCarInstance(String type) {Car c = null;if ("Benz".equals(type)) {c = new Benz();}if ("Ford".equals(type)) {c = new Ford();}return c;}
}public class Test {public static void main(String[] args) {Car c = Factory.getCarInstance("Benz");if (c != null) {c.run();c.stop();} else {System.out.println("造不了这种汽车。。。");}}}

工厂方法模式:有四个角色,抽象工厂模式,具体工厂模式,抽象产品模式,具体产品模式。不再是由一个工厂类去实例化具体的产品,而是由抽象工厂的子类去实例化产品

// 抽象产品角色
public interface Moveable {void run();
}// 具体产品角色
public class Plane implements Moveable {@Overridepublic void run() {System.out.println("plane....");}
}public class Broom implements Moveable {@Overridepublic void run() {System.out.println("broom.....");}
}// 抽象工厂
public abstract class VehicleFactory {abstract Moveable create();
}// 具体工厂
public class PlaneFactory extends VehicleFactory {public Moveable create() {return new Plane();}
}public class BroomFactory extends VehicleFactory {public Moveable create() {return new Broom();}
}// 测试类
public class Test {public static void main(String[] args) {VehicleFactory factory = new BroomFactory();Moveable m = factory.create();m.run();}
}

抽象工厂模式:与工厂方法模式不同的是,工厂方法模式中的工厂只生产单一的产品,而抽象工厂模式中的工厂生产多个产品

/抽象工厂类
public abstract class AbstractFactory {public abstract Vehicle createVehicle();public abstract Weapon createWeapon();public abstract Food createFood();
}
//具体工厂类,其中Food,Vehicle,Weapon是抽象类,
public class DefaultFactory extends AbstractFactory{@Overridepublic Food createFood() {return new Apple();}@Overridepublic Vehicle createVehicle() {return new Car();}@Overridepublic Weapon createWeapon() {return new AK47();}
}
//测试类
public class Test {public static void main(String[] args) {AbstractFactory f = new DefaultFactory();Vehicle v = f.createVehicle();v.run();Weapon w = f.createWeapon();w.shoot();Food a = f.createFood();a.printName();}
}

代理模式
今天有点累了,代理模式先不讲了,以后有空再更新

这两天开始写微信公众号了,大家可以去关注一下哦~~~
顺便抱怨一下,最近我要被搞死了,天天加班,我也需要过正常”生活”的,好吗,根本就没有时间,算了,洗洗睡了

面试必备:常用的设计模式总结相关推荐

  1. Python程序员面试必备常用问题答案及解析

    源 | 小象     文 | 水木华章 在发布<Python程序员面试,这些问题你必须提前准备!>一文后,应广大程序员朋友的强烈要求,小编就Python程序员面试必备问题整理了一份参考答案 ...

  2. Python/Java程序员面试必备常用问题解析与答案

    转自AI算法联盟,理解python技术问题,以及一些常见的java面试中经常遇到的问题,这些面试问题分为四类: 是什么(what) 如何做(how) 说区别/谈优势(difference) 实践操作( ...

  3. 保研面试/考研复试:英语口语面试必备话题及常用句型句式整理(四)

    保研面试/考研复试:英语口语面试必备话题及常用句型句式整理(一) 保研面试/考研复试:英语口语面试必备话题及常用句型句式整理(二) 保研面试/考研复试:英语口语面试必备话题及常用句型句式整理(三) 目 ...

  4. 「面试必备」常见Java面试题大综合 马云见了都点赞

    一.Java基础 1.Arrays.sort实现原理和Collections.sort实现原理 答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSor ...

  5. 面试必备:《Java 最常见 200+ 面试题全面解析》

    春招在即,想让面试官在短短的几十分钟内就认可你的能力? 想在最快的时间内收获 Java 技术栈最核心的知识点? 想要更全面.更深入的了解 Java 技术? 这里能够给你想要的所有答案? 给准备面试的大 ...

  6. 2020年 Java 最常见200+ 面试题全解析:面试必备

    Java 最常见200+ 面试题全解析:面试必备 如想了解更多更全面的Java必备内容可以阅读:所有JAVA必备知识点面试题文章目录: JAVA必备知识点面试题 序 言 在本篇文章开始之前,我想先来回 ...

  7. 22年最新金九银十面试必备

    Hibernate 的缓存机制. 什么是 Hibernate 延迟加载. 为什么要用 spring. SQL(主要考察 Group by 和 Order by 相关知识) 查询每个班级成绩最高的学生. ...

  8. 面试必备:LinkedHashMap源码解析(JDK8)

    1 概述 在上文中,我们已经聊过了HashMap,本篇是基于上文的基础之上.所以如果没看过上文,请先阅读面试必备:HashMap源码解析(JDK8)  本文将从几个常用方法下手,来阅读LinkedHa ...

  9. 虚拟机的分类_「面试必备」Java虚拟机知识点复习手册(下)

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

  10. 游戏必备组件有哪些_面试必备:2019Vue经典面试题总结(含答案)

    点击右上方红色按钮关注"web秀",让你真正秀起来 面试必备:2019Vue经典面试题总结(含答案) 一.什么是MVVM? MVVM是Model-View-ViewModel的缩写 ...

最新文章

  1. 清瘦的记录者: 一个比dbutils更小巧、好用的的持久化工具
  2. 深度操作系统 15 发布 —— 不忘初心,追逐梦想
  3. java new关键字
  4. MongoDB 与传统数据库的对比
  5. [Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建
  6. PowerShell+you-get批量下载B站视频
  7. linux操作系统基础与实训教程,清华大学出版社-图书详情-《Linux操作系统基础与实训教程》...
  8. 手机 modem开发(22)---modem 通信 -- 几模 几频
  9. matlab2c使用c++实现matlab函数系列教程-sortrows函数
  10. 字符串转化为整型,为0,而不是1
  11. memcached(五)--源码分析,启动
  12. 【转】使用spring @Scheduled注解执行定时任务
  13. 100000以内的水仙花数C语言,找出1000000内的水仙花数
  14. 关于实时推送系统的那点事
  15. JavaScript中的模块化开发
  16. c++win32项目 如何显示后再删除一个绘图_如何运用Excel,R等软件结合PPT做出你想要的矢量图...
  17. Python——青蛙旅行项目
  18. android怎么装windows系统,普通电脑怎么装Windows和安卓的双系统?
  19. Hbuilderx是html5,HBuilderX代码提示系统说明
  20. Code VBA完整代码块,创建Visual Basic源代码

热门文章

  1. window expects a time attribute for grouping in a stream environment.
  2. EditPlus工具添加XML格式化插件
  3. PMP考试中常见的翻译问题
  4. UVM 验证方法学之interface学习系列文章
  5. 长沙地铁一号线大客流运输组织优化研究
  6. 根据某一列拆分Excel为多个表格
  7. 关于中医把脉的一点想法
  8. 【安全】Java(web)项目安全漏洞及解决方式【面试+工作】
  9. Git教程之如何版本回退
  10. Type-C潮流下 如何衡量一款数据线好坏?