设计模式综述

《java23种设计模式总结》http://blog.csdn.net/lc2470348636/article/details/8935758

《设计模式大集锦 程序员面试全攻略》http://www.csdn.net/article/2012-06-04/2806324-software-design-interview-questions

 

====================================================================================================

 

设计模式:构建OO系统的隐含经验。

 

 

特性:可复用,可扩充,可维护。

 

模式:历经验证的OO设计经验。针对设计问题的通用解决方案。

思想:将变化的部分抽出来封装。

 

面向对象编程基本概念:1.抽象 2.封装 3.继承 4.多态

面向对象原则是目标,设计模式是做法。

经验复用:有人已经解决你的问题了。

 

1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。(封装变化)

2.针对接口编程,而不是针对具体实现编程。(关键在多态)

 

3 - 模板方法模式

Head First设计模式》8.模板方法模式 P311

目标:封装算法块。

public abstract class CaffeineBeverage{

 void final prepareRecipe(){

  boilWater();

  brew();

  pourInCup();

  addCondinents();

 }

 

 abstract void brew();

 abstract void addCondinents();

 void boilWater(){

  //实现此函数

 }

 

}

模板方法模式细节:P325

钩子:作为条件控制,影响抽象类中的算法流程。

 

实例

要排序鸭子, 就必须实现compareTo()方法 P338

Arrays.sort(ducks);

或者Java API中 java.io中的read()方法。

 

P342 自己实现Swing JFrame中的paint()方法,通过覆盖paint()方法将自己代码插入JFrame算法中。

 

工厂方法是模板方法的一种特殊版本。

 

4 - 迭代器和组合模式

管理良好的集合。

P370 实现java.util.Iterator接口。

 

迭代器模式:

        提供一种方法,顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

5 - 策略模式

定义了算法族,并分别封装起来,让它们之间可以互相替换。

此模式让算法的变化独立于使用算法的客户。

 

6 - 观察者模式

让你的对象熟悉现状。

出版者+订阅者。

 

定义了对象之间的一对多依赖;这样一来,当一个对象改变状态的时候,它的所有依赖者都会受到通知并自动更新。

 

观察者模式哒代表:MVC模式。

 

Java API中java.util包中:Observer接口与Observable类。

 

——Java内置的观察者模式:

 

import java.util.Observerable;

import java.util.Observer;

//天气数据:被观察的对象。

public class WeatherData extends Observerable{

 private float temperature,humidity,pressure;

 public WeatherData(){}

 public void measurementsChanged(){

  setChanged();

  notifyObervers();

 }

 public void setMeasurements(float temperature){

  this.temperature = temperature;

  measurementsChanged();

 }

}

public class CurrentConditionsDisplay implements Observer,DisplayElement{

 Observerable observer;

 private float temperature,humidity;

 public CurrentConditionsDisplay(Observerable observable){

  this.observable = observable;

  observable.addObserver(this);

 }

 public void update(Observerable obs,Object arg){

  if(obs instanceof WeatherData){

   WeatherData weatherData = (WeatherData)obs;

   this.temperature = weatherData.getTemperature();

   ...

  }

 }

}

7 - 装饰者模式

 

Java类库中的例子》

 

 

 

 

 

 

 

使用对象组合的方式,在运行时装饰类。

给对象赋予新的职责。

 

设计原则:类应该对拓展开放,对修改关闭。拓展行为的OO设计技巧。

 

装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者比继承更有弹性的替代方案。

 

public abstract class Beverage{

 String description = "Unkonw ....";

 public getDescription(){};

 public abstract double cost();

}

装饰者取代Beverge,获类型

public abstract class ComdimentDecorator extends Beverage{

 public abstract String getDescription();

}

写饮料的代码:

public class Espresso extends Beverage{

 public Espresso(){description = "Espresso"};

 public double cost(){

  return 1.99;

 }

}

写调料代码【摩卡:装饰者】

public class Mocha extends ComdimentDecorator{

 Beverage beverage;//组合

 public Mocha(Beverage bev){

  this.beverage = bev;

 }

 public String getDescription(){return beverage.getDescription()+"Mocha";}

 public double cost(){return 20+beverage.cost();}

}

 

缺点:

会造成大量的小类。

 

当介绍“工厂”和“生成器”模式时,将有更好的方式建立被装饰者对象。

8 - 命令模式

封装调用 P229

 

把方法调用method invocation 封装起来。

 

命令模式:将请求封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。

 

命令模式也支持可撤销的操作。

 

public class RemoteControlTest{

 public static void main(String[] args){

  SimpleRemoteControl remote = new GarageDoor();

  Light light = new Light();

  GarageDoor garageDoor = new GarageDoor();

 

  //下两行代码明显显示了如何将命令封装起来

  LightOnCommond lightOn = new LightOnCommond(light);

  GarageDoorOpenCommond garageOpen = new GarageDoorOpenCommond(garageDoor);

 

  //发出请求的对象

  remote.setCommond(lightOn);

  remote.buttonWasPressed();

  remote.setCommond(garageOpen);

  remote.buttonWasPressed();

 }

}

 ConcreteCommond 定义了动作和接收者之间的绑定关系。

 

 将发出请求的对象和执行请求的对象解耦。

 

public class MacroCommand implements Command{

 Command[] commands;

 public MacroCommand (Command[] commands){

  this.commands = commands;

 }

 public void execute(){

  for(int i=0;i<commands.length;i++){

   commands[i].execute();

  }

 }

}

Command[] partyOn = {LightOn,stereoOn,tvOn,hottubOn};

Command[] partyOff = {LightOff,stereoOff,tvOff,hottubOff};

MacroCommand partyOnMacro = new MacroCommand(partyOn);

remoteControl.setCommond(0,partyOnMacro,partyOffMarco);

 

9 - 适配器模式

将类的接口转换成想要的接口。

将对象包装起来以简化其接口。

 

适配器模式:将一个类的接口,转换成客户期望的另一个接口。

 

适配器让原来接口不兼容的类可以合作。

 

类适配器:多重继承。

对象适配器:利用组合的方式将请求传送给被适配器类。

 

10 - 外观模式

300页

外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。

 

外观定义了一个高层接口,让子系统更容易使用。

 

“最少知识”原则:

减少对象之间的交互。

不要让太多的实体类耦合。

 

转载于:https://www.cnblogs.com/lsx1993/p/4631785.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络纳新水粉画,小学教育专业“书法诗画创作社团”顺利举办纳新活动...

原标题&#xff1a;小学教育专业“书法诗画创作社团”顺利举办纳新活动小学教育专业“书法诗画创作社团”顺利举办纳新活动为了丰富同学们的课余生活&#xff0c;向全校师生展现小学教育专业的风采&#xff0c;2018年10月21日上午9:30&#xff0c;隶属于小学教育专业的“书法诗…

理论物理极础3:动力学

莱尼&#xff1a;“乔治&#xff0c;物体咋会运动起来&#xff1f;” 乔治&#xff1a;“因为物体受力&#xff0c;莱尼。” 莱尼&#xff1a;“物体咋会又不动了&#xff1f;” 乔治&#xff1a;“还是因为物体受力&#xff0c;莱尼。” 亚里士多德运动定律 亚里士多德生活在一…

计算机贡共享,做点小贡献,计算机、控制面板、网络和共享中心……的路径

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼你好 你那个天气怎么改的 就是 红色圈 那个麻烦你 帮我改下[rainmeter]iron man/jarvis theme desktopby barbadianOne-weather VARIABLES ;Metadata added by RainBrowser;http://rainmeter.net/RainCMS/?qRainmeter101_AnatomyO…

人工神工机器人是什么_为什么企业要用电销机器人代理人工

不管各行各业&#xff0c;只要你有产品有服务&#xff0c;就离不开销售工作。销售工作分哪些&#xff0c;我们可以简单总结&#xff1a;1、人工客服&#xff0c;通过人工处理电话、上门、在线咨询工作。2、销售人员&#xff0c;分析客户名单&#xff0c;主动寻找筛选洽谈客户&a…

【WS-Federation】到底有多少公司在用WS-Federation

到底有多少公司在用WS-Federation&#xff1f; sso先调用一个登录接口 获取一个token 然后再调用各种业务接口 如果是ssl token 直接暴露就行了 没有ssl 最好每次取一个token&#xff0c; token 设置过期时间 问题可能不会这个简单 要不用框架干屁用 继续研究 转载于:https://w…

树莓派网页服务器的网页留言板,树莓派利用Django搭建聊天网页服务器 —— 准备篇...

利用Django在树莓派上搭建一个聊天网页服务器&#xff0c;话很少说&#xff0c;直接上流程。html首先来看一下刚建立的Django项目文件结构&#xff1a;前端 项目文件配置setting.py配置第一个咱们先来看一下setting.py文件的配置&#xff0c;须要更改两处地方&#xff1a;pytho…

hdu4956 Poor Hanamichi

解决暴力的直接方法。一个直接的推论x%11方法。打表可以发现&#xff0c;以解决不同的情况都不会在很大程度上会出现。 所以从l暴力开始枚举。找到的第一个错误值输出要。如果它超过r同样在美国发现-1. #include <iostream> #include <cstdlib> #include <cstri…

verilog异步复位jk触发器_HDLBits: 在线学习Verilog(Problem 120-126)

这几天在刷HDLBits,参考的是HDLBits中文导学专栏:HDLBits中文导学,刷到120题的时候发现缺少了中间的120题到126题的解析&#xff0c;就打算自己边写边记录一下。也方便其他的同学进行参考。Problem 120 Simple FSM 1s牛刀小试一个很简单的状态机的题目&#xff0c;给定一个输入…

python中字典的value可以为任意对象_Python学习之字典的删改查操作

字典的删改查操作https://www.zhihu.com/video/1185227901603094528字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。字典的每个键值(key>value)对用冒号(:)分割&#xff0c;每个对之间用逗号(,)分割&#xff0c;整个字典包括在花括号({})中 。字典是Python语言…

网站服务器商标属于哪类,网络水晶头属于商标哪个类别

水晶头是一种能沿固定方向插入并自动防止脱落的塑料接头&#xff0c;俗称“水晶头”&#xff0c;专业术语为RJ-45连接器(RJ-45是一种网络接口规范&#xff0c;类似的还有RJ-11接口&#xff0c;就是我们平常所用的“电话接口”&#xff0c;用来连接电话线)。之所把它称之为“水晶…

ipython notebook超级好用

这个东西超级好用&#xff0c;以后要以c和python为主要沟通语言了。 转载于:https://www.cnblogs.com/jianyingzhou/p/4644466.html

svn 服务器忽略文件夹,SVN忽略不提交文件夹

层次分析模型(AHP)及其MATLAB实现今天用将近一天的时间学习了层次分析模型(AHP),主要参考了一份pdf,这个网站,和暨南大学章老师的课件,现写出一些自己总结的要点. 一.层次分析法的基本步骤: 角度一: 实际问题——分解——> ...SQL Server调优系列基础篇 - 常用运算符总结前言…

require.js的基本用法

一、为什么要用require.js&#xff1f; 最早的时候&#xff0c;所有Javascript代码都写在一个文件里面&#xff0c;只要加载这一个文件就够了。后来&#xff0c;代码越来越多&#xff0c;一个文件不够了&#xff0c;必须分成多个文件&#xff0c;依次加载。下面的网页代码&…

一班洽谈框架细化_你怎样看待一家公司的合同管理制度?

公司合同管理制度设计细节【一】前文#PG201907提出了建立和完善合同管理制度的大纲&#xff0c;现就大纲之下的细节问题做出补充说明&#xff0c;具体管理制度范本&#xff0c;需各位根据公司实际情况予以细化和内化吸收&#xff0c;但切记三点&#xff1a;合法性、合理性、高效…

CSS3实现小黄人动画

转载请注明出处&#xff0c;谢谢&#xff01; 每次看到CSS3动画就心痒痒想试一下&#xff0c;记得一个多月前看了白树哥哥的一篇博客&#xff0c;突然开窍&#xff0c;于是拿他提供的demo试了一下&#xff0c;感觉很棒&#xff01;下图为demo提供的动画帧设计稿。 自己也想说搞…

ACM用N个正方体来建造金字塔问可以建造多少层

Description Vanya got n cubes. He decided to build a pyramid from them. Vanya wants to build the pyramid as follows: the top level of the pyramid must consist of 1 cube, the second level must consist of 1  2  3 cubes, the third level must have 1  2 …

editview只输入英文_搜狗输入法Mac版更新:适配苹果M1处理器

12月24日消息 据搜狗输入法官方&#xff0c;近日Mac版应用程序已完成更新&#xff0c;新版本引入苹果M1桌面处理器原生支持&#xff0c;体验更优、速度更快&#xff0c;兼容搭载MacBook Pro、MacBook Air和Mac mini等机型&#xff0c;令使用苹果M1系列产品的用户们获得更加高效…

添加nginx为系统服务(service nginx start/stop/restart)

1、在/etc/init.d/目录下编写脚本&#xff0c;名为nginx 1 #!/bin/sh 2 # 3 # nginx - this script starts and stops the nginx daemon 4 # 5 # chkconfig: - 85 15 6 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ 7 # proxy and IMAP/POP3…

angular div 滚动条事件_DOM事件

事件是在编程时系统内发生的动作或发生的事情&#xff08;单击、鼠标移动、滚动页面等&#xff09;。HTML DOM 使 JavaScript 有能力对 HTML 事件做出反应。JS与HTML之间的交互是通过事件实现的&#xff0c;DOM支持大量的事件。事件的本质是程序各个组成部分之间的一种通信方式…

python 保存图片代码_最简单的selenium+Python自动右键保存图片

[toc]最近需要爬古籍影印版图片&#xff0c;但是对方网站有反爬虫&#xff0c;于是考虑用selenium&#xff0c;selenium比想象中的简单。右键的难点在于在元素上执行右键之后&#xff0c;selenium就不能操作菜单了。所以需要别的办法&#xff0c;有的使用autoit第三方软件&…