java语言
java语言
thefist11
难以忘记编程路上领导和好友的细致指导,所以必须努力!(真诚希望大家多多指导!)
展开
-
《研磨设计模式》chap25 访问者模式Visitor(3)联合组合模式+总结
1. 联合组合模式//抽象的组件对象,相当于访问者模式中的元素对象 public abstract class Component { //接受访问者的访问 public abstract void accept(Visitor visitor); //向组合对象中加入组件对象 public void addChild(Component child) { // 缺省的实现,抛出例外,因为叶子对象没有这个功能,或者子组件没有实现这个功能 throw new Unsupport原创 2021-03-27 11:37:51 · 235 阅读 · 0 评论 -
《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景
1. 实现//各种客户的父类 public abstract class Customer { private String customerId;// 客户编号 private String name; //客户名称 ... get().set() public abstract void accept(Visitor visitor);}//企业客户public class EnterpriseCustomer extends Customer{ priv原创 2021-03-27 11:24:56 · 158 阅读 · 0 评论 -
《研磨设计模式》chap25 访问者模式Visitor(1)模式介绍
场景:给用户做服务,分为个人用户、企业用户,服务不断地变。1. 正常编码(不使用模式)public abstract class Customer { private String customerId; //客户编号 private String name;//客户名称 //客户提出服务请求的方法 public abstract void serviceRequest();}public class EnterpriseCustomer extends Cust原创 2021-03-27 10:44:24 · 174 阅读 · 3 评论 -
《研磨设计模式》chap24 桥接模式bridge(2)场景应用
1. 模式应用到场景中public abstract class AbstractMessage { //持有一个实现部分的对象 protected MessageImplementor impl; public AbstractMessage(MessageImplementor impl){ this.impl = impl; } public void sendMessage(String message,String toUser){ this.impl.send原创 2021-03-18 21:57:33 · 236 阅读 · 1 评论 -
《研磨设计模式》chap24 桥接模式bridge(1)基本概念
场景:现有“email“、“sms手机消息“两种发送消息方式,要加个是否“紧急消息“的类型区分,如何设计类?1. 正常编码(不使用模式)如果又要来个“特急“”类型,那类就更多了,这样肯定不好 2. 模式介绍实际上场景是一种二维目标的应用(编者语)。把x轴看成抽象类型,把y轴看成实现类型。public interface Implementor { /** * 示例方法,实现抽象部分需要的某些具体功能 */ public void operationImpl();}/原创 2021-03-18 21:49:30 · 197 阅读 · 0 评论 -
《研磨设计模式》chap23 职责链模式chainOfResponsibility(3)功能扩展+总结
1. 扩展功能链:某个链处理完继续向下传递。public class SaleModel { //销售的商品 private String goods; public String getGoods() { return goods; } public void setGoods(String goods) { this.goods = goods; } public String toString(){ return "商品名称="+goods+",销售数量="+原创 2021-03-30 00:05:13 · 177 阅读 · 0 评论 -
《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景
1. 初步实现public abstract class Handler { //持有下一个处理请求的对象 protected Handler successor = null; //设置下一个处理请求的对象 public void setSuccessor(Handler successor){ this.successor = successor; } //处理聚餐费用的申请 public abstract String handleFeeRequest原创 2021-03-30 00:02:35 · 169 阅读 · 0 评论 -
《研磨设计模式》chap23 职责链模式chainOfResponsibility(1)模式简介
场景:申请经费,有好几个领导审批,项目经理、部门经理、总经理,最后总会有一个人回复审批结果。1. 正常编码public class FeeRequest { //提交聚餐费用申请给项目经理 public String requestToProjectManager(String user,double fee){ String str = ""; if(fee < 500){ //项目经理的权限比较小,只能在500以内 str = this.projectHandle(u原创 2021-03-29 23:58:21 · 205 阅读 · 0 评论 -
《研磨设计模式》chap22 装饰模式Decorator(4)AOP+总结
1. AOP面向方面编程共性功能AOP调用示意图public class SaleModel { private String goods; //销售的商品 public String getGoods() { return goods; } public void setGoods(String goods) { this.goods = goods; } public String toString(){ return "商品名称="+goods+",购买数原创 2021-03-30 09:04:03 · 151 阅读 · 0 评论 -
《研磨设计模式》chap22 装饰模式Decorator(3)I/O流
1.1public class IOTest { public static void main(String[] args)throws Exception { //流式读取文件 DataInputStream din = null; try{ din = new DataInputStream( new BufferedInputStream( new FileInputStream("IOTest.txt") ) ); //然后就可以获.原创 2021-03-30 08:56:20 · 170 阅读 · 0 评论 -
《研磨设计模式》chap22 装饰模式Decorator(2)应用到场景
//计算奖金的组件接口 public abstract class Component { public abstract double calcPrize(String user,Date begin,Date end);}//基本的实现计算奖金的类,也是被装饰器装饰的对象 public class ConcreteComponent extends Component{ public double calcPrize(String user, Date begin, Date en..原创 2021-03-30 08:25:37 · 118 阅读 · 0 评论 -
《研磨设计模式》chap22 装饰模式Decorator(1)模式简介
场景:算员工奖金,各种奖金,有个人销售奖,团队奖,环比增加销售奖等等1. 正常编码public class Prize { //计算某人在某段时间内的奖金,有些参数在演示中并不会使用, public double calcPrize(String user,Date begin,Date end){ double prize = 0.0; //计算当月业务奖金,所有人都会计算 prize = this.monthPrize(user, begin, end);原创 2021-03-30 08:21:11 · 166 阅读 · 0 评论 -
《研磨设计模式》chap21 解释器模式Interpreter(2)parse模型
1. 定义读取表达式,构建抽象语法树,叶子类,节点类,context上下文step1:分解表达式,得到需要解析的元素名称和该元素对应的解析模型step2:根据节点的属性转换成为相应的解释器对象step3:组合抽象语法树,一定要按照先后顺序来组合,否则对象的包含关系就乱了 2.2.1 第1步:分解表达式 /** * 按照从左到右顺序来分解表达式,得到需要解析的元素名称, * 还有该元素对应的解析模型 * @param expr 需要分解的表达式 * @return 得到.原创 2021-03-15 22:44:23 · 183 阅读 · 0 评论 -
《研磨设计模式》chap21 解释器模式Interpreter(1)模式介绍
场景:读写xml文件,如果代码"写死了":谁是谁的child,万一文件父子节点改了,又要改代码。1. 正常编码(不使用模式)public class ReadAppXml { /** * 读取配置文件内容 * @param filePathName 配置文件的路径和文件名 * @throws Exception */ public void read(String filePathName)throws Exception{ Document doc = null; //建原创 2021-03-15 22:15:41 · 180 阅读 · 0 评论 -
《研磨设计模式》chap20 享元模式 Flyweight (4)总结
1. 不共享的外部状态public class UnsharedConcreteFlyweight implements Flyweight{ //记录每个组合对象所包含的子组件 private List<Flyweight> list = new ArrayList<Flyweight>(); public void add(Flyweight f) { list.add(f); } public boolean match(String securityE原创 2021-03-14 10:07:01 · 152 阅读 · 0 评论 -
《研磨设计模式》chap20 享元模式 Flyweight (3)重写应用场景
public interface Flyweight { //判断传入的安全实体和权限,是否和享元对象内部状态匹配 public boolean match(String securityEntity,String permit);}public class FlyweightFactory { private static FlyweightFactory factory = new FlyweightFactory(); private FlyweightFactory(){ }.原创 2021-03-14 10:03:48 · 117 阅读 · 0 评论 -
《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍
1.享元模式的定义享元:分离出被缓存对象实例中,哪些数据是不变且重复出现的,哪些数据是经常变化的。(内部状态分离出来共享)对象的内部状态: 不变且重复出现的数据,对象的外部状态: 变化的数据运用共享技术有效地支持大量细粒度的对象,通过共享享元对象来减少对内存的占用。把外部状态分离出来,放到外部,让应用在使用的时候进行维护,并在需要的时候传递给享元对象使用。享元工厂:为了控制对内部状态的共享,并且让外部能简单地使用共享数据,提供一个工厂来管理享元。public interface Fl.原创 2021-03-14 10:00:48 · 142 阅读 · 0 评论 -
《研磨设计模式》chap20 享元模式 Flyweight (1)前奏介绍
场景:分配人员对各种数据表的权限,并验证权限操作。eg.1. 编码public class TestDB { //用来存放授权数据的值 public static Collection<String> colDB = new ArrayList<String>(); static{ //通过静态块来填充模拟的数据 colDB.add("张三,人员列表,查看"); colDB.add("李四,人员列表,查看"); colDB.add("李四,薪资原创 2021-03-14 09:49:28 · 188 阅读 · 0 评论 -
《研磨设计模式》chap19 备忘录模式
应用场景:需要保存对象的状态和值。1. 简介public interface Memento { }public class Originator { //表示原发器的状态 private String state = ""; public Memento createMemento() {//创建保存原发器对象的状态的备忘录对象 return new MementoImpl(state); } //重新设置原发器对象的状态,让其回到备忘录对象记录的状态 public原创 2021-03-13 10:28:56 · 219 阅读 · 0 评论 -
《研磨设计模式》chap18 状态模式state(4)例子
public class StateMachine { //持有一个状态对象 private State state = null; //包含流程处理需要的业务数据对象,不知道具体类型, 用Object,反正只是传递到具体的状态对象里面 private Object businessVO = null; //执行工作,客户端处理流程的接口方法。 public void doWork(){ //转调相应的状态对象真正完成功能处理 this.state.doWork(th..原创 2021-03-29 23:55:26 · 129 阅读 · 0 评论 -
《研磨设计模式》chap18 状态模式state(3)应用到场景
public interface VoteState { //处理状态对应的行为 public void vote(String user,String voteItem,VoteManager voteManager);}public class SpiteVoteState implements VoteState{ public void vote(String user, String voteItem, VoteManager voteManager) { //恶意投票 .原创 2021-03-29 23:53:10 · 102 阅读 · 0 评论 -
《研磨设计模式》chap18 状态模式state(2)模式介绍
1. 状态的平行性与策略模式的不同,策略模式的行为是平等的2. 上下文和状态处理对象上下文是持有状态的对象,但是上下文自身并不处理跟状态相关的行为,而是把处理状态的功能委托给了状态对应的状态处理类来处理。在具体的状态处理类中经常需要获取上下文自身的数据,甚至在必要的时候会回调上下文的方法,因此,通常将上下文自身当作一个参数传递给具体的状态处理类。客户端一般只和上下文交互。客户端可以用状态对象来配置一个上下文,一旦配置完毕,就不再需要和状态对象打交道了。客户端通常不负责运行期间状态的维护,也不负原创 2021-03-29 23:51:48 · 206 阅读 · 0 评论 -
《研磨设计模式》chap18 状态模式state(1)模式简介
场景:投票管理1. 正常编码//投票管理 public class VoteManager { //记录用户投票的结果,Map<String,String>对应Map<用户名称,投票的选项> private Map<String,String> mapVote = new HashMap<String,String>(); //记录用户投票次数,Map<String,Integer>对应Map<用户名称,投票的次数>原创 2021-03-29 23:48:48 · 267 阅读 · 0 评论 -
《研磨设计模式》chap17 策略模式(2) 总结
1. 新增加context 上下文:使用人民币支付和美元支付public interface PaymentStrategy { //公司给某人真正支付工资 public void pay(PaymentContext ctx);}public class RMBCash implements PaymentStrategy{ public void pay(PaymentContext ctx) { } }public class PaymentContext { //应被原创 2021-03-13 11:02:52 · 158 阅读 · 0 评论 -
《研磨设计模式》chap17 策略模式(1) 简介
客户报价,价格有多种情况。1. 正常思路解决:分成多个函数public class Price { //报价,对不同类型的,计算不同的价格 public double quote(double goodsPrice,String customerType){ if("普通客户".equals(customerType)){ return this.calcPriceForNormal(goodsPrice); }else if("老客户".equals(customerType)){原创 2021-03-13 10:48:42 · 177 阅读 · 0 评论 -
《研磨设计模式》chap16 模板方法模式
1. 定义把模板实现成为抽象类,为所有的子类提供了公共的功能,就是定义了具体的算法骨架;同时在模板中把需要由子类扩展的具体步骤的算法定义成为抽象方法,要求子类去实现这些方法,这就约束了子类的行为。eg. 总结起来,一个较为完整的模板定义示例,1.1 有两种人登录,一种是用户,一种是管理员,登录过程一样...原创 2021-03-13 12:19:08 · 166 阅读 · 0 评论 -
《研磨设计模式》chap15 组合模式(2)改写示例+总结
1. 改写示例在添加子组件的方法实现中,加入对父组件的引用实现。在删除子组件的方法实现中,加入把被删除的商品类别对象的父商品类别,设置成为被删除的商品类别的子类别的父商品类别的功能。实现新的返回组件的子组件对象的功能。 public class Composite extends Component{ public void addChild(Component child) { //延迟初始化 if (childComponents == null) { childComponents原创 2021-03-13 11:19:56 · 176 阅读 · 2 评论 -
《研磨设计模式》chap15 组合模式(1)简介
1. 应用场景介绍树:叶子public class Leaf { //叶子对象的名字 private String name = ""; public Leaf(String name){ this.name = name; }}public class Composite { //用来记录包含的其它组合对象 private Collection<Composite> childComposite = new ArrayList<Composite>原创 2021-03-13 11:12:12 · 190 阅读 · 0 评论 -
《研磨设计模式》chap14 迭代器模式(3) 举例
1. java的iteratorpublic class ArrayIteratorImpl implements Iterator{ //用来存放被迭代的数组 private PayModel[] pms = null; //用来记录当前迭代到的位置索引 private int index = 0; public ArrayIteratorImpl(SalaryManager aggregate){ Collection<PayModel> tempCol = new原创 2021-03-13 13:31:41 · 110 阅读 · 0 评论 -
《研磨设计模式》chap14 迭代器模式(2)算工资举例
一个公司:数组工资一个公司:list工资如何统一?1. 正常编码public class PayModel { private String userName;//支付工资的人员 private double pay;//支付的工资数额}public class SalaryManager{ //用数组管理 private PayModel[] pms = null; //获取工资列表 public PayModel[] getPays(){ return pms;原创 2021-03-13 13:29:20 · 284 阅读 · 0 评论 -
《研磨设计模式》chap14 迭代器模式(1)简介
一个公司:数组工资一个公司:list工资如何统一?public abstract class Aggregate { public abstract Iterator createIterator();}public class ConcreteAggregate extends Aggregate { private String[] ss = null;//示意,表示聚合对象具体的内容 public ConcreteAggregate(String[] ss){ this原创 2021-03-13 12:29:22 · 156 阅读 · 0 评论 -
《研磨设计模式》chap13 命令模式
场景:机箱外面有个按钮,按钮连着线,线接着主板。按下按钮发送启动电脑的命令。1.1.1 组装1.2 触发public interface Command { //执行命令对应的操作 public void execute();}public class ConcreteCommand implements Command { //持有相应的接受者对象 private Receiver receiver = null; //示意,命令对象可以有自己的状态 private原创 2021-03-13 14:16:30 · 440 阅读 · 6 评论 -
《研磨设计模式》chap12 观察者模式observer(3)例子
场景:不同的人收到通知处理不一样。public interface WatcherObserver { //被通知的方法 public void update(WaterQualitySubject subject); //设置观察人员的职务 public void setJob(String job); // 获取观察人员的职务 public String getJob();}public class Watcher implements WatcherObserver{原创 2021-03-28 10:37:50 · 137 阅读 · 0 评论 -
《研磨设计模式》chap12 观察者模式observer(2)模式介绍
1. 两个步骤. 注册. 通知2. 推模型和拉模型推模型目标对象主动向观察者推送目标的详细信息,不管观察者是否需要,推送的信息通常是目标对象的全部或部分数据,相当于是在广播通信。拉模型目标对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到目标对象中获取,相当于是观察者从目标对象中拉数据。一般这种模型的实现中,会把目标对象自身通过update方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用来获取了。推模型是假定目标对象知道观察者需要原创 2021-03-28 10:34:36 · 152 阅读 · 0 评论 -
《研磨设计模式》chap12 观察者模式observer(1)模式简介
场景:读者订杂志,订报纸,当有新的期刊和版本来了,读者怎么知道?1. 模式介绍public class Subject { //用来保存注册的观察者对象 private List<Observer> observers = new ArrayList<Observer>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Ob原创 2021-03-28 10:31:53 · 158 阅读 · 0 评论 -
《研磨设计模式》chap11 代理proxy模式
场景:需要查询所有用户数据,不能翻页都显示出来,只显示姓名,在需要的情况下,点击某个用户的姓名出现详细信息。1. 正常编码:仅查询当前数据public static void main(String[] args) throws Exception{ UserManager userManager = new UserManager(); Collection<UserModel> col = userManager.getUserByDepId("0101"); System.原创 2021-03-14 09:00:47 · 163 阅读 · 0 评论 -
《研磨设计模式》chap10 中介者模式Mediator(2)应用举例
人员类和部门类之间的关系:删除一个人或一个部门时,需要同时删除人员类和部门类里的数据,增加操作也是如此。public class User{ private String userId; //用户编号 private String userName; //人员离职 public boolean dimission(){ //1:要先通过中介者去清除掉所有与这个人员相关的部门和人员的关系 DepUserMediatorImpl mediator = DepUserMediator原创 2021-03-12 02:00:46 · 250 阅读 · 0 评论 -
《研磨设计模式》chap10 中介者模式Mediator(1)简介
1. 使用场景如果电脑没有主板,各个配件的关系为有主板后:2. 中介者模式简介:各对象通过中介者来交互//Mediator.javapublic interface Mediator { public void changed(Colleague colleague);}//Colleague.javapublic abstract class Colleague { private Mediator mediator; public Colleague(Mediato原创 2021-03-12 01:57:03 · 177 阅读 · 2 评论 -
《研磨设计模式》chap9 原型模式Prototype
场景:订单拆分1000份,然后还有两种订单:个人和公司的。1. 常规解决/** * 订单的接口 */public interface OrderApi { /** * 获取订单产品数量 * @return 订单中产品数量 */ public int getOrderProductNum(); /** * 设置订单产品数量 * @param num 订单产品数量 */ public void setOrderProductNum(int num);}/** *原创 2021-03-14 09:00:57 · 167 阅读 · 0 评论 -
《研磨设计模式》chap8 生成器模式Builder
现有一“导出数据”的需求,分别导出到文本和xml。正常人的思路代码如下:/** * 导出数据到文本文件的对象 */public class ExportToTxt { /** * 导出数据到文本文件 * @param ehm 文件头的内容 * @param mapData 数据的内容 * @param efm 文件尾的内容 */ public void export(ExportHeaderModel ehm,Map<String,Collection<原创 2020-11-06 17:52:26 · 168 阅读 · 0 评论
分享