`
huhu_long
  • 浏览: 68690 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
文章列表
迭代器模式是为了方便遍历集合而产生, 但现在java提供的迭代器基本上已经能满足程序员的需求, 所以这就成为该模式慢慢没落的原因。 不过还是简单介绍一下吧。 我们以遍历用户列表来获取用户资料为例。 先定义用户资料类, 纯pojo public class UserInfo { private String userName; private String address; private String gender; // gets & sets } 然后定义User接口 public interface User { void addUser ...
适配器(Adaptor)是大家日常生活中基本上天天要接触的。 电脑, 笔记本, 手机等等接上电源就得用到适配器。 那适配器是用来干什么的呢? 适配器就是将一个接口或类转换为另一个接口或类。 现在很多网站都和腾讯,新浪等合作, 比如通过QQ号或微波就可以直接登录原来的网站。 那这里面就肯定存在一个用户信息的转换过程。 因为两个不同的公司对用户信息的设计完全一样的可能性几乎等于中双色球头奖。。。 那么我们的Adaptor就可以大打出手了。 先看看我们假定的两个用户信息接口/类 public interface SinaUserInfo { String getAddress(Strin ...

策略模式

对于不同的需求可能有不同的实现, 但这些实现还不能独立成为什么东西。 当把它们放到锦囊里面之后, 就成了一个个妙计了, 这就是策略。 策略模式其实和代理模式很像, 区别在于代理模式的代理同样需要具备被代理者的行为 - 即要实现和被代理者实现的同一接口或抽象类, 而策略模式中的“代理”仅仅是个皮囊而已。 这次我们一加减法为例: 先看策略接口 public interface Strategy { double calc(double x, double y); } 加减发的实现 public class PlusStrategy implements Strategy { ...

装饰模式

装饰模式, 顾名思义就是在原有基础上进行装饰。 那么“装饰者” 和 “被装饰者” 理所当然就成了两大主角。 下面我们以黑咖啡加奶加糖为例来介绍: 先看看被装饰者, 毕竟这个是source, 接下来的所有修饰都是基于它进行的。 public abstract class Coffee { // 先品尝咖啡 public abstract void taste(); // 喝完之后评价评价 public abstract void evaluate(); } // 具体的被装饰者 - 黑咖啡 public class BlackCoffee extends Co ...
责任链模式就是将请求和处理分开了, 定义一个责任链, 请求不需要关心是怎样处理的, 请求沿着责任链传递, 直到找到能处理该请求的handler为止。 先看看AbstractRequest public abstract class Request { enum Type { NORMAL, SPECIAL } protected Type type; protected String desc; protected Request(Type type, String desc) { this.type = type; this.desc = d ...

命令模式

顾名思义, 命令模式就是给不同的命令然后交给别人做就可以了。 下面我们以 项目经理 下发命令给 漂亮的 女秘书 以及 TechLead 为例来介绍。 先看看命令的接受者 public abstract class Receiver { // 接到命令肯定需要先分析分析 public abstract void analyze(); // 分析好了就可以执行 public abstract void execute(); // 执行完了再汇报一下 public abstract void report(); } 定义两个接收者: 女秘书 + Tec ...
中介者模式, 主角当然是中介者。那中介者是干什么的呢? 问得好! 中介者的引入就是为了“解耦”。 很多同学可能会碰到一下情况。 A在做某件事的时候要依赖于B; 反过来B在做某事的时候也要依赖于A。 那这样就形成了相互依赖, 耦合度高。 于是乎, 中介者的出场便可以解决这个问题。 在下面的场景中, colleague1完成某个操作需要colleague2的两次check; 而colleague2在做某个操作的时候又先要从colleague1那获取feedback。 先看看客户端代码 public class Client { public static void main(Strin ...

原型模式

原型模式的核型就是一个clone方法。 这也没什么好说的。 说道clone, 还是谈谈浅拷贝和深拷贝吧。 先看浅拷贝 浅拷贝只拷贝对象本身, 对于引用类型是不做拷贝的, 拷贝后的对象和被拷贝对象指向同一内存地址。 定义一个对象RMB public class RMB implements Cloneable { enum Type { hard { @Override public String toString() { return "硬币"; } }, soft { @Override p ...
接着说代理模式。 动态代理就是让程序在运行是自动去找代理。 客户端代码 public class Client { public static void main(String[] args) { // 被代理人登场 Killer killer = new NailsKiller(); // 代理登场 Killer proxy = NailsKillerProxy.newInstance(killer); // 执行 proxy.setTarget("钉子户"); proxy.kill(); } } 钉子 ...
代理模式有较委托模式, 就是委托人委托代理做什么事情。 代理模式分静态和动态两种。 先讲静态的, 这个比较简单。 我们以“幕后黑手雇职业杀手+枪杀钉子户” 为场景来介绍。 客户端代码 public class Client { public static void main(String[] args) { // 幕后黑手想干掉"钉子户" Killer manipulator = new Manipulator(); // 职业杀手出场 Killer hitman = new Hitman(manipulator); // 杀 ...
Builder 模式很重要的两个概念就是导演类和Builder类。 Builder类只负责每个独立的部分的构建,而导演类则统筹规划,一手操控这大局。 p.s: 每个人都向往幸福的生活, 但程序员苦啊。。。 不过还好程序员什么都能造。 少废话, 先上客户端代码 public class Client { public static void main(String[] args) { AbstractBuilder builder = new PerfectLifeBuilder(); Director director = new Director(builder); ...
模板方法模式比较简单, 其实就是对一些不可变的业务进行封装, 对可变的部分提供扩展。 那扩展当然就是接口或者抽象类了。 但考虑到又有不可变的部分, 所一抽象类就成了不二的选择。 一个抽象模板类通常包括 1. 基本方法 2. 模板方法 其中的基本方法可能被模板方法调用。 大家都有寄快递的经历, 下面就快递来阐述一下模板方法模式。 先看客户端代码 public class Client { public static void main(String[] args) { // 张三选择顺风快递 ExpressTemplate zhangSan = new ShunFeng ...
抽象工厂模式是工厂模式的升级版本。适用多系列多产品的场景。 先看定义: Provide an interface for creating families of related or dependent objects without specifying their concrete classes. 假如现在需要向之前工厂模式的例子中加入进口和国产的概念。那应该怎样改呢? 先看客户端代码 public static void main(String[] args) { // 进口车工厂 AbstractCarFactory importedCarFactory = new ...
缺点: 不符合开闭原则 工厂类 public class SimpleCarFactory { public static <T extends Car> T createCar(Class<T> c) { Car car = null; try { car = (Car) Class.forName(c.getName()).newInstance(); } catch (Exception e) { // Handle exception... } return (T) car; } } 客户 ...
产品由某一具体工厂的同一方法生产, 工厂只需被告知具体产品的类型就可以了。 适用单一系列多产品的场景。 废话少说, 上代码: 产品的抽象 public interface Car { void showDesc(); void start(); void showCurrentSpeed(); void stop(); } 具体的产品1 public class Benz implements Car { @Override public void showCurrentSpeed() { System.out.println(& ...
Global site tag (gtag.js) - Google Analytics