文档章节

设计模式(Hibernate)

学而时习之
 学而时习之
发布于 2015/04/21 09:49
字数 1417
阅读 107
收藏 11

1、概述

2、面向对象设计原则

    1)单一职责原则

    2)开闭原则

    3)里氏替换原则

    4)依赖倒置原则

    5)接口隔离原则

     6)迪米特原则

    7)组合/聚合复用原则

3、设计模式

4、设计模式分类

5、简单工厂模式

 样例:

产品接口类(Product):

package com.ljb.simplefactory;
/**
 * 产品接口
 * @author LJB
 * @version 2015年4月21日
 */
public interface Product {
 /**产品生产工艺*/
 public void craftwork();
 
 /**产品特征*/
 public void type();
}

 产品类(鲜奶):

 package com.ljb.simplefactory;
/**
 * 鲜奶
 * @author LJB
 * @version 2015年4月21日
 */
public class Creamery implements Product {
 @Override
 public void craftwork() {
  System.out.println("牛奶+除菌=鲜奶");
 }
 @Override
 public void type() {
  System.out.println("原味浓香");
 }
}

产品类(酸奶):

package com.ljb.simplefactory;
/**
 * 酸奶
 * @author LJB
 * @version 2015年4月21日
 */
public class Yoghourt implements Product {
 @Override
 public void craftwork() {
  System.out.println("牛奶+酵母菌+糖=酸奶");
 }
 @Override
 public void type() {
  System.out.println("酸甜可口");
 }
}

简单工厂类:

package com.ljb.simplefactory;
/**
 * 静态工厂
 * @author LJB
 * @version 2015年4月21日
 */
public class StaticFactory {
 public static Product factory (String str) throws BadException {
  if (str.equalsIgnoreCase("creamery")) {
   System.out.println("生产鲜奶");
   return new Creamery();
  } else if (str.equalsIgnoreCase("yoghourt")) {
   System.out.println("生产酸奶");
   return new Yoghourt();
  } else {
   throw new BadException("没有此产品");
  }
 }
}

异常类:

package com.ljb.simplefactory;
/**
 * 自定义异常类
 * @author LJB
 * @version 2015年4月21日
 */
public class BadException extends Exception {
 public BadException (String msg) {
  super(msg);
 }
}

测试类:

package com.ljb.simplefactory;
/**
 * 测试类
 * @author LJB
 * @version 2015年4月21日
 */
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  try {
   Product x = StaticFactory.factory("creamery");
   x.craftwork();
   x.type();
   Product y = StaticFactory.factory("yoghourt");
   y.craftwork();
   y.type();
  } catch (BadException e) {
   e.printStackTrace();
  }
  
 }
}

执行结果:

生产鲜奶
牛奶+除菌=鲜奶
原味浓香
生产酸奶
牛奶+酵母菌+糖=酸奶
酸甜可口

小结:

工厂需要知道多有产品

缺点:对开闭原则支持不够

6、工厂方法模式

 注:引入简单工厂模式中的产品接口及产品类

增加:

工厂接口(ProductFactory):

package com.ljb.factorymethod;
/**
 * 工厂接口类
 * @author LJB
 * @version 2015年4月21日
 */
public interface ProductFactory {
 public Product factory();
}

工厂实现类(鲜奶工厂):

package com.ljb.factorymethod;
/**
 * 鲜奶工厂
 * @author LJB
 * @version 2015年4月21日
 */
public class CreameryFactory implements ProductFactory {
 @Override
 public Product factory() {
  System.out.println("生产鲜奶");
  return new Creamery();
 }
}

工厂实现类(酸奶工厂):

package com.ljb.factorymethod;
/**
 * 酸奶工厂类
 * @author LJB
 * @version 2015年4月21日
 */
public class YoghourtFactory implements ProductFactory {
 @Override
 public Product factory() {
  System.out.println("生产酸奶");
  return new Yoghourt();
 }
}

测试类:

package com.ljb.factorymethod;
/**
 * 测试类
 * @author LJB
 * @version 2015年4月21日
 */
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  ProductFactory y = new CreameryFactory();
  y.factory().craftwork();
  y.factory().type();
  ProductFactory x = new YoghourtFactory();
  x.factory().craftwork();
  x.factory().type();
 }
}

7、代理模式

 样例:

抽象主题:

package com.ljb.proxy;
/**
 * 抽象主题或者是接口
 * @author LJB
 * @version 2015年4月21日
 */
public abstract class Subject {
 /**
  * 声明一个抽象的请求方法
  */
 abstract public void request();
}

真实主题:

package com.ljb.proxy;
/**
 * 真是主题
 * @author LJB
 * @version 2015年4月21日
 */
public class RealSubject extends Subject {
 @Override
 public void request() {
  System.out.println("实现请求");
 }
}

代理主题:

package com.ljb.proxy;
/**
 * 代理主题(通过代理实现对真实主题的引用,并且可以加入自己的方法)
 * @author LJB
 * @version 2015年4月21日
 */
public class ProxySubject extends Subject {
 private RealSubject realSubject;
 
 @Override
 public void request() {
  preRequest();
  if (realSubject == null) {
   realSubject = new RealSubject();
  }
  realSubject.request();
  aftRequest();
 }
 
 public void preRequest() {
  System.out.println("请求前的方法");
 }
 
 public void aftRequest () {
  System.out.println("请求后的方法");
 }
}

测试类:

package com.ljb.proxy;
/**
 * 测试类
 * @author LJB
 * @version 2015年4月21日
 */
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  Subject proxy = new ProxySubject();
  proxy.request();
 }
}

运行结果:

请求前的方法
实现请求
请求后的方法

8、策略(strategy)模式

样例:

策略抽象类(抽象账户):

package com.ljb.strategy;
/**
 * 抽象账户
 * @author LJB
 * @version 2015年4月21日
 */
public abstract class Account {
 /**
  * 计算产品的真实价格
  * @param amount
  * @param price
  * @return
  */
 public abstract float getFactPrice (int amount , int price);
}

策略实现类(普通账户):

package com.ljb.strategy;
/**
 * 普通客户商品价格计算类
 * @author LJB
 * @version 2015年4月21日
 */
public class CommonAccount extends Account {
 @Override
 public float getFactPrice(int amount, int price) {
  return amount*price;
 }
}

策略实现类(会员账户):

package com.ljb.strategy;
/**
 * 会员商品价格计算类
 * @author LJB
 * @version 2015年4月21日
 */
public class InsiderAccount extends Account {
 @Override
 public float getFactPrice(int amount, int price) {
  // TODO Auto-generated method stub
  return amount*price*9/10;
 }
}

策略实现类(VIP账户):

package com.ljb.strategy;
/**
 * vip会员商品价格计算类
 * @author LJB
 * @version 2015年4月21日
 */
public class VipAccount extends Account {
 @Override
 public float getFactPrice(int amount, int price) {
  // TODO Auto-generated method stub
  return amount*price*8/10;
 }
}

策略维护类:

package com.ljb.strategy;
/**
 * 此类用于维护策略类的引用
 * 各个算法封装起来,通过维护类实现对各个算法的引用
 * @author LJB
 * @version 2015年4月21日
 */
public class Context {
 /**持有策略类的引用*/
 private Account account;
 
 /**
  * 构造方法,实例化策略类的引用
  * 父类作为方法形参的使用方式
  * @param account
  */
 public Context (Account account) {
  this.account = account;
 }
 
 /**
  * 调用策略方法
  * @param amount
  * @param price
  * @return
  */
 public float doAccount (int amount , int price) {
  return account.getFactPrice(amount, price);
 }
}

测试类:

package com.ljb.strategy;
/**
 * 测试类
 * @author LJB
 * @version 2015年4月21日
 */
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  String name = "CD唱片";
  int amount = 2;
  int price = 50;
  float sum = 0;
  
  // 普通客户
  Context common = new Context(new CommonAccount());
  sum = common.doAccount(amount, price);
  System.out.println("您是普通客户没有折扣,商品名称:" + name +
   "数量:" + amount + "价格:" + price + "应付金额:" + sum);
  
  // 会员客户
  Context insider = new Context(new InsiderAccount());
  sum = insider.doAccount(amount, price);
  System.out.println("您是会员享受9折优惠,商品名称:" + name +
   "数量:" + amount + "价格:" + price + "应付金额:" + sum);
  
  // VIP客户
  Context vip = new Context(new VipAccount());
  sum = vip.doAccount(amount, price);
  System.out.println("您是VIP会员享受8折优惠,商品名称:" + name +
   "数量:" + amount + "价格:" + price + "应付金额:" + sum);
 }
}

运行结果:

您是普通客户没有折扣,商品名称:CD唱片数量:2价格:50应付金额:100.0
您是会员享受9折优惠,商品名称:CD唱片数量:2价格:50应付金额:90.0
您是VIP会员享受8折优惠,商品名称:CD唱片数量:2价格:50应付金额:80.0

 

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 框架和设计模式
下一篇: 过滤器和监听器
学而时习之
粉丝 29
博文 93
码字总数 42877
作品 0
西安
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
11/06
0
0
发个设计模式网络互动公开课, 非资深的兄弟们有听的吧(7.1晚8点开课)

各位兄弟,分享下,我和朋友开的软件开发公开课,不知道大家有需要听的吧? 乐学讲堂之--"设计模式第二讲" 授课时间:2012年7月1日(星期天)晚上8:00 授课方式:在线互动讲堂 收费标准:免...

大牛直播
2012/06/28
236
1
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
8
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
14
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
15
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
8
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部