- 浏览: 74215 次
文章列表
饮料售卖机,需要有人监视它,如果饮料卖完了,需要往里面放饮料。
对饮料售卖机进行监视,通过把饮料售卖机对象传到监视器对象中以获取饮料售卖机的库存量以及当前状态。
饮料售卖机上进行监视,还是需要有人跑到售卖机前(很不方便)。
如果要远程监视饮料售卖机,我们可以通过饮料售卖机的代理,无需修改我们的代码。
代理假装它是真正的对象,但是其实一切的动作是它利用网络和真正的对象沟通。
代理模式:为另一个对象提供一个替身,以控制对这个对象的访问。
代理控制访问的方式:
远程代理控制访问远程对象
虚拟代理控制访问创建开销大的资源
保护代理基于权限控制对资源的访问
财务系 ...
自动售饮料机
状态:售空、有钱、没钱、出售中。
通过创建一个实例变量来持有状态值,并在方法内书写条件代码来处理不同状态。
我们需要处理所有发生的动作(状态的转换),动作包括:投钱、退钱、按出货按钮、出货。
package com.ez.other;
/**
* 通过一个实例变量来持有状态值,在方法内书写条件代码来处理不同状态。
* @author 窗外赏雪(EZ编程网)
*/
public class DrinkMachine {
// 售空
final static int SOLD_OUT = 0;
// 没钱
final static ...
命令的搜索:which
文件的搜索:whereis、locate、find
which命令搜索
在终端机模式当中,连续输入两次[tab]按键就能够知道使用者有多少命令可以下达。(PATH 目录中可以找到的命令)
那你知不知道这些命令的完整档名放在哪里?举例来说,ls 这个常用的命令放在哪里呢? 就透过 which 或 type 来找寻吧!
这个命令是根据『PATH』这个环境变量所规范的路径,去搜寻『运行档』的档名~
所以,重点是找出『运行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已 ...
考勤系统有个子系统,叫加班子考勤系统。
我们不仅要支持多个系统,甚至还要支持子系统。
我们不能把加班考勤子系统加入到系统数组,因为类型不一样。
使用组合模式就可以解决这个问题
组合模式:允许你将对象组合成树形结构来表现“整体/部分”层次结构。
组合能让客户以一致的方式处理个别对象以及对象组合。
提供一个接口,让个别对象和对象组合共同使用,能够用统一的做法来处理个别对象和对象组合。
这样程序员就可以使用统一的做法来遍历人员和子系统。
package com.ez.biz;
import java.util.ArrayList;
import java ...
迭代器模式:提供一种方法顺序访问一个聚合对象(array、list等)中的各个元素,而又不暴露其内部的表示。
一旦实现迭代器,我们只需要一个循环,就可以多态地处理任何项的集合。
有两个系统:绩效查询系统,工资单查询系统。
绩效查询系统(PerformanceSystem),拥有公司所有的员工信息,使用数组实现。
工资查询系统(SalarySystem),拥有公司所有的员工信息,使用List实现。
我们必须使用两个循环遍历这两个系统的人员信息。
使用迭代器模式,使用一种方法就可以访问所有系统的人员信息,而且不需要关心各个系统的人员数据结构。
package com.e ...
模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
这个模式是用来创建一个算法的模板。
模板就是一个方法,具体的说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变,同时由子类提供部分实现。
例子:
系统登录(普通账号,管理员账号)
打开系统
填写信息(管理员账号需要多填一个动态密码)
提交登陆
行为日志记录(管理员账号需要记录行为日志)
我们把这组步骤做成一个模板。
package com.ez. ...
用户离职场景
1、交接任务(TaskCenter)
2、归还电脑(AssetCenter)
3、回收权限(PermissionCenter)
4、回收账号(AccountCenter)
5、清算工资(FinanceCenter)
我们把离职任务写成类和方法的调用。
taskCenter.transitionTask();
assetCenter.recycleAsset();
permissionCenter.recyclePermission();
accountCenter.recycleAccount();
financeCenter.payCalculati ...
适配器模式:将一个类的接口,转换为客户期望的另一个接口。让原本接口不兼容的类可以合作无间。
可以通过创建适配器进行接口转换,让不兼容的接口变成兼容的。
调用适配器方法,适配器使用被适配者,把调用转换成被适配者的一个或多个调用接口。
适配器组合被适配者,实现目标接口。
老气象站的天气预报接口:getWendu();
新气象站的天气预报接口:getTemperature();
TencentQQ之前一直使用老的气象站,获取气温。
由于老的气象站设备落后数据不精确,想调用新气象局的天气预报接口。
但是新气象站的接口和老气象站的接口不兼容,必须改代码。
Tencen ...
命令模式将发出命令的对象和执行命令的对象解耦。
发出命令的对象是遥控器(调用者),执行命令的对象是电视(接收者)。
如何将调用者和接收者解耦:
利用命令对象,把命令(例如打开电视机)封装成一个命令对象。
让遥控器按钮存储一个命令对象,那么当按钮被按下的时候,就可以使用命令对象做相关的工作。
遥控器并不需要知道工作内容是什么,只要有一个命令对象和遥控器沟通,把电视打开就可以了。 这样遥控器和电视就解耦了。
在被解耦的两者之间是通过命令对象进行沟通的。
命令对象封装了接收者(电视机)的一个或一组动作,并且只暴露出一个execute()方法,当此方法被调用的时候,接收者就 ...
单件模式:确保一个类只有一个实例,并提供一个全局访问点。
package com.ez.biz;
/**
* 单件模式,
* @author 窗外赏雪(EZ编程网)
*/
public class Singleton {
//利用一个私有静态变量记录类的唯一实例
private static Singleton uniqueInstance;
//私有构造方法,只有类内部才能调用构造方法
private Singleton(){}
//全局访问点
public static Singleton getInstance(){
//延迟实例化 ...
当我们获取数据库连接(mysql,oracle,db2)的时候,一般会用到这样的代码:
DbConnection getConnection(String type){
DbConnection dc;
if(type.equals("mysql")){
dc=new MySqlConnection();
}else if(type.equals("oracle")){
dc=new OracleConnection();
}else if(type.equals("db2")){
dc=new ...
使用对象组合的方式(被装饰者组合到装饰者里面),做到在运行时装饰类。
去数码城配电脑,除了买电脑,还需要配置很多配件。
Computer是一个抽象类,cost()方法是抽象的(因为每个电脑的价格都不一样),子类必须定义自己的实现。
个人电脑:Thinkpad,Acer, Sony等
电脑配件,如:MemoryBank,CD,Audio。根据所加的配件不同,最后买单的价格也不同。
第一种实现方式,我们为每种个人电脑和每种配件排列组合,生成笛卡尔积个数的类,调用对应的类的cost()方法,就可以直接得到最后买单的价格。
这种方式的缺点就是类太多,每次新增一个配件,就需要创 ...
我们要开发一个内容发布系统,当运营商有内容发布的时候,通知所有用户新发布的内容。
先看一个错误的示范:
当移动运营商发布新的活动,就通知所有订阅的用户。
public void publishContent(String message){
//主题获取新发布的内容,然后通知所有用户新发布的内容。
userA.sendMessage(message);
userB.sendMessage(message);
userC.sendMessage(message);
}
针对具体实现编程,会导致以后用户订阅,退订时,必须修改程序。
我们现在来看看观察者模式, ...
当我们编写JAVA程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用对象确实包含该方法。
如果需要让这个引用变量来调用它运行时类型的方法,则是必须把它强制类型转换成运行时类型,强制类型转换需要借助于类型转换运算符。
强制类型转换时需要注意:
•基本类型之间的转换只能在数值型之间进行,这里所说的数值类型包括整数型、字符型和浮点型。但数值型不能和布尔型之音进行类型转换。
•引用类型之间的转换只能在继承关系之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时就会出现错误。
如果试图把一个父类实例转换子类类型,则必须这个对象 ...
Java引用变量有两种类型:编译时类型和运行时类型。
编译时类型由声明该变量时使用的类型决定。
运行时类型由实际赋给该变量的对象决定。
如果编译时类型和运行时类型不一致,就会出现所谓的多态。
package com.ez;
/**
* @author 窗外赏雪(EZ编程网)
*/
public class Father {
public int age=40;
public void say(){
System.out.println("大人说话");
}
public void eat( ...