- 浏览: 14319 次
- 性别:
- 来自: 天津
最新评论
文章列表
/**
* 享元模式
*
* 如果程序中存在大量的对象,并且对象之间也较为类似
* 这样,对象之间类似的部分就可以共享出来,这样就减少了内存开销
*
* 1、具体实体类(大量对象中可共享部分)
* 2、工厂类(共享池,返回已有对象或创建新对象)
* 3、外部状态(大量对象中可不共享部分)
*
* 优点:
* 1、节省内存开销
* 缺点:
* 1、增加了系统度
* 2、虽然节省了内存,但增加了运行时长
*
* 场景:
* 1、五子棋
* 共享部分:颜色(黑、白)
* 分共享部分:位置(1...3 ...
/**
* 建造者模式
*
* 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
*
* 1、建造者接口,定义建造者需要提供的功能
* 2、指挥者类,定义了建造过程
* 3、具体建造者提供建造的具体实现
*
* 优点:
* 1、客户端调用时不用知道内部细节,指定建造者即可
* 2、建造者之间是相互独立又可相互替换的,便于维护/扩展
*
* 与工厂模式的区别
* 工厂模式:侧重组装过程
* 建造者模式:侧重组装所需零件的生产过程
*
* 工厂模式就像玩积木,原料都差不多 ...
学习实践
目标:
1、简化POI导出Excel的调用,方便使用(只提供数据即可)。
2、具有一定的扩展性(整体默认样式、单元格样式)。
3、对一些设计模式的具体实践。
技术要求:
对POI进行扩展。
模仿JSONObject(JsonValueProcessor)、easyui的datagrid(formatter/styler)。
模板方法模式、桥接模式。
涉及的类:
ExportGenerator
核心类
导出具体实现类,子类可对其进行扩展
ExportConfig
核心类
用于保存导出相关配置
CellValueProces ...
/**
* 模板方法模式
*
* 实现算法时,整体过程很固定,只有部分易改变
* 则可以将固定的部分提取到父类中实现,由子类实现易变的部分
*
* 基本方法:
* 1、抽象方法:父类声明,由子类具体实现
* 2、具体方法:父类实现,子类可以根据情况进行覆盖或直接继承
* 3、钩子方法:子类重写的父类方法
*
* 优点:
* 1、简化了子类的代码,方便维护
* 2、如有特殊情况也可重写父类多个方法,具有一定扩展性
*
* 场景:
* JDBCTemplate、HibernateTemplate
* ...
效果图:
各文件路径(我的extra文件夹与easyui文件夹在同一等级):
extra\fieldset\lq.fieldset.js
主要js文件
extra\fieldset\lq.fieldset.css
主要样式文件
extra\fieldset\lq.fieldset.html
测试页面
extra\fieldset\images\panel_tools.png
按钮图标(拷贝于easyui,可根据主题不同进行修改)
lq.fieldset.js
/*
Easyui1.4.2
Create time:2015-11-0 ...
/**
* 装饰模式
*
* 类似于代理模式
* 与代理的区别:
* 1、真实角色持有(?)
* 代理:代理角色并不一定需要调用者提供真实角色(调用者不需要持有真实角色)
* 装饰:调用者需要持有真实角色,并提供给装饰器
* 2、真实角色控制
* 代理:代理角色返回任意真实角色,甚至不返回真实角色
* 装饰:对传入的真实角色进行装饰,然后将装饰后的角色返回
*
* 代理:我通过 代理(代理角色) 买一套精装修的房子
* 装饰:我先买房,再找 人(装饰角色) 给我装修
*/
public class Decorator ...
/**
* 备忘录模式
*
* 1、源发器类(具体的业务类/需要备份的类)
* 2、备忘录类(拷贝类,用于恢复)
* 3、负责人类(管理所有的拷贝)
*
* 将对象在某个时间点信息保存起来,方便以后查看
*
* 优点:
* 1、具体 ...
/**
* 桥接模式
* 解决多维度可变属性造成的多类问题
* (用到了组合,但与 组合模式 没关系)
*
* 场景:
* 各大品牌生产电子产品
* 品牌:联想、戴尔、苹果
* 产品:台式机、笔记本、pad
*
* 如果采用继承的方式实现类结构,那类的数量则是一个乘积的关系
* (联想、戴尔、苹果)*(台式机、笔记本、pad)
* 这样会产生一些问题:
* 1、产生大量的类,类之间还会有重复的功能(冗余)
* 2、品牌 和 类型 之间是有关系的(没有解耦)
* 3、添加其中一个实现,则需要添加一定数量的另一 ...
/**
* 适配器模式
* 1、源角色(已有的角色)
* 2、目标角色(需要成为的角色)
* 3、适配器角色(将 原角色 转换成 目标角色)
*
* 优点:
* 1、不用修改已有代码
* 2、复用已有代码
* 缺点:
* 1、会造成类相互之间的关系不清晰
*
* 注意:
* 属于"补丁"方法,尽量不要有机会使用
*
* 场景:
* 功能复合需求,但是调用跟需求不匹配时,中间通过一个转换类来实现两者之间的调用
*
* NBA不可轻易改变,CBA不可轻易改变
* CBA球员 ...
/**
* 模拟 观察者模式
* 场景:
* 小孩睡觉,家长工作
* 小孩醒来,家长喂饭
*/
public class ObserverDemo01 {
public static void main(String[] args) throws InterruptedException {
MyBaby b = new MyBaby();
MyParent p1 = new MyParent("爸爸");
MyParent p2 = new MyParent("妈妈");
MyParent ...
/**
* 所有工厂模式都是为了让对象的调用者和对象创建过程分离,简化调用端代码,便于维护
* 简单地对象创建则不需要使用工厂模式
*/
/**
* 简单工厂(静态工厂)
*
* 1、创建产品接口
* 2、创建工厂类
* 3、工厂类通过传入参数的不同返回不同的产品
*
* 优点:
* 1、代码调用简单,类之间的关系也较简单
* 缺点:
* 1、拓展性稍差,如果需要增加新的产品,则需要修改已有代码(工厂类),不符合开闭原则(可扩展、禁修改)
*/
public class SimpleFactroy {
publ ...
/**
* 灰烬之灵EM(同一场景、同一资源)
*/
public class EM {
/**
* 最大充能数量
*/
private final int MAX_F_COUNT = 3;
/**
* 火之余烬F 充能个数
*/
private int count;
/**
* 火之余烬 个数是否已满
*/
private boolean isFull(){
return count >= MAX_F_COUNT;
}
/**
* 火之余烬 个数是否不为0
*/
...
/**
* 通过 java.lang.reflect.Proxy 实现动态代理基本写法
*
* 由于代理类实现代理功能的模式基本相同,所以我们可以写一个通用的方法去代理所有的实现类
*
* 实现大致思路(动态编译):
* 1、通过String去拼 XxxProxy.java ...
/**
* 通过接口方式实现静态代理(聚合)
*
* 1、定义公共接口(IMoveable)
* 2、定义真实对象 继承接口(IMoveable) 实现功能(Tank)
* 3、定义代理类 继承接口(IMoveable) 实现前后逻辑/业务逻辑(TankTimeProxy/TankLogProxy)
*
* 调用的时候可以通过修改代理顺序来来改变逻辑实现顺序(test1/test2)
* 优点:
* 业务类只关注逻辑本身,灵活,重用性较好
* 缺点:
* 1)一个接口只能服务于一种功能类,多功能类就需要多接口+多代理类(此时 ...
创建线程三种方法:
/**
* 线程创建方法1:创建线程类
* 1、创建线程类,继承Thread并重写 run() 方法
* 2、创建对象实例,调用对象 start() 方法来启动线程
*/
public class CreateTest1 {
public static void main(String[] args) {
Rabbit rab = new Rabbit();
Tortoise tor = new Tortoise();
rab.start();
tor.start();
for(int i=0;i<100 ...