java 中设计模式
1. 单例模式(一个类只有一个实例)
package ch.test.notes.designmodel; /**
* Description: 单例模式 (饿汉模式 线程安全的)
*
* @author cy
* @date 2019年05月10日 9:33
* version 1.0
*/
public class Singelon { private static Singelon si = new Singelon(); public static Singelon getInstance() {
return si;
} private Singelon() { // 将构造方法封装为私有化
} public void print(){
System.out.println("打印--------->");
}
}
package ch.test.notes.designmodel; /**
* Description: 单例模式 (懒汉模式)线程不安全
*
* @author cy
* @date 2019年05月10日 9:33
* version 1.0
*/
public class Singelon { private static Singelon si = null; private Singelon() { // 将构造方法封装为私有化
} public static Singelon getInstance() {
if(si == null){
si = new Singelon();
}
return si;
} public void print(){
System.out.println("打印--------->");
}
}
2. 工厂模式(多个子类实现一个接口,根据不同子类复写父类方法,根据业务产生不同的实例)
package ch.test.notes.designmodel; /**
* Description:定义一个人的接口
*
* @author cy
* @date 2019年05月10日 9:50
* version 1.0
*/
public interface Person1 { // 人的身高
String getHeight(); // 职位
String getWork(); }
创建两个实现类
package ch.test.notes.designmodel; /**
* Description: 实现类
*
* @author cy
* @date 2019年05月10日 9:52
* version 1.0
*/
public class Student implements Person1 { @Override
public String getHeight() {
return "";
} @Override
public String getWork() {
return "我的职位是学生!";
}
}
package ch.test.notes.designmodel; /**
* Description:实现类
*
* @author cy
* @date 2019年05月10日 9:53
* version 1.0
*/
public class Tearch implements Person1 { @Override
public String getHeight() {
return "";
} @Override
public String getWork() {
return "我的职位是教师!";
}
}
创建一个工厂,根据类型不同创建不同的对象
package ch.test.notes.designmodel; /**
* Description: 人员工厂
*
* @author cy
* @date 2019年05月10日 9:55
* version 1.0
*/
public class Factory { public static Person1 getInstance(String type){
Person1 person = null;
if("".equals(type)){
person = new Student();
}else {
person = new Tearch();
}
return person;
}
}
测试(传入不同的类型,得到不同的对象内容)
package ch.test.notes.designmodel; /**
* Description: // 设计模式
*
* @author cy
* @date 2019年05月10日 9:16
* version 1.0
*/
public class main { public static void main(String[] args) {
Person1 instance = Factory.getInstance("");
String work = instance.getWork();
System.out.println(work); } }
3. 代理模式 (由一个主题来操作一个真实主题,代理服务器来完成一个真实业务以外的业务)
角色(要做的东西, 假设只有vip 能做, 代理就是vip 普通人员不是,所以需要代理人代理)
package ch.test.notes.designmodel; /**
* Description: 商店
*
* @author cy
* @date 2019年05月10日 10:32
* version 1.0
*/
public interface Store { // 买东西
String getGoods(boolean vip); }
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 10:35
* version 1.0
*/
public class StoreImpl implements Store { private int num = ; @Override
public String getGoods(boolean vip) {
if(!vip){
System.out.println("只有VIP才能购买商品!");
return "只有VIP才能购买商品!";
}
num --;
System.out.println("购买了货物,剩余数量为"+ num);
return "购买了货物,剩余数量为"+ num;
}
}
package ch.test.notes.designmodel; /**
* Description: 代理
*
* @author cy
* @date 2019年05月10日 10:34
* version 1.0
*/
public class Proxy{ private Store store;
private Boolean vip = true; public Proxy(Store store){
this.store = store;
} // 购买商品
public String getGoods() {
// 这里也可以做一些校验
// 检查身份证
return store.getGoods(this.vip);
}
}
package ch.test.notes.designmodel; /**
* Description: // 设计模式
*
* @author cy
* @date 2019年05月10日 9:16
* version 1.0
*/
public class main { public static void main(String[] args) {
StoreImpl store = new StoreImpl();
store.getGoods(false);
new Proxy(store).getGoods();
} }
结果:
只有VIP才能购买商品!
购买了货物,剩余数量为9
4. 委派模式(相当于领导给项目经理下达任务,项目经理将不同的任务,下达到不同的人上面,和上面的区别是注重的是结果,不需要过程)
(角色 做任务 员工A 员工B 组长 组长接到任务后,分配给A和B)
package ch.test.notes.designmodel; /**
* Description: 老板需要做的任务
*
* @author cy
* @date 2019年05月10日 11:08
* version 1.0
*/
public interface ITarget { public void doSomething(String command);
}
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 11:10
* version 1.0
*/
public class TargetA implements ITarget{ @Override
public void doSomething(String command) {
System.out.println("我是员工A,开始做"+command+"工作");
}
}
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 11:10
* version 1.0
*/
public class TargetB implements ITarget{ @Override
public void doSomething(String command) {
System.out.println("我是员工B,开始做"+command+"工作");
}
}
package ch.test.notes.designmodel; import java.util.HashMap;
import java.util.Map; /**
* Description: 组长
*
* @author cy
* @date 2019年05月10日 11:11
* version 1.0
*/
public class Leader implements ITarget { private Map<String,ITarget> map = new HashMap<>(); public Leader(){
map.put("打扫",new TargetA());
map.put("吃饭",new TargetB());
} @Override
public void doSomething(String command) {
map.get(command).doSomething(command);
} public static void main(String[] args) {
new Leader().doSomething("吃饭");
new Leader().doSomething("打扫");
}
}
5. 策略模式
背景:在软件开发过程中,要实现一种功能,需要多种算法或者策略,我们可以根据应用场景不同,选择不同算法和策略和实现该功能。比如一系列算法,把每个算法封装
起来,并且使他们可以相互替换,这就是策略模式。
假如我们有一个鸭子的抽象类,包含行为所有的鸭子都会游泳,属性鸭子的信息,如果我们增加一个飞行的功能,但是有些鸭子没有飞行的能力,所以我们不能再抽象类
中加入飞行的方法。这时候,就需要我们抽象一个飞的接口。
1.首先抽象一个策略接口
package ch.test.notes.designmodel; /**
* Description:策略接口
*
* @author cy
* @date 2019年05月10日 12:37
* version 1.0
*/
public interface CarFunction { void run(); //每辆车有不同的行驶方法
}
2.具体策略父类
package ch.test.notes.designmodel; /**
* Description:每个车都具有的相同的属性和行为
*
* @author cy
* @date 2019年05月10日 12:38
* version 1.0
*/
public class Car implements CarFunction { protected String name; //车名字
protected String color; //车颜色 public Car(String name, String color) {
this.name = name;
this.color = color;
} @Override
public void run() {
System.out.println(color +" " + name +"在行驶。。。");
}
}
具体策略实现子类
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 13:09
* version 1.0
*/
public class SmallCar extends Car {
public SmallCar(String name, String color) {
super(name, color);
} @Override
public void run() {
System.out.println(color +" " + name +"在高速的行驶。。。");
}
}
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 13:11
* version 1.0
*/
public class BussCar extends Car { public BussCar(String name, String color) {
super(name, color);
} @Override
public void run() {
System.out.println(color +" " + name +"在缓慢的行驶。。。");
} }
应用场景
package com.design.strategy;
/**
*
* @ClassName : Person
* @Description : 应用场景类
*
*/
public class Person {
private String name; //姓名
private Integer age; //年龄
private Car car; //拥有车 public void driver(Car car){
System.out.print(name +" "+ age+" 岁 "+" 开着");
car.run();
} public Person(String name,Integer age) {
this.name=name;
this.age=age;
} }
运行环境
package com.design.strategy;
/**
*
* @ClassName : Strategy
* @Description : 运行环境类:Strategy
* @date : 2017年12月9日 上午11:43:58
*
*/
public class Strategy {
public static void main(String[] args) {
Car smallCar = new SmallCar("路虎","黑色");
Car bussCar = new BussCar("公交车","白色");
Person p1 = new Person("小明", );
p1.driver(smallCar);
p1.driver(bussCar);
}
} 运行结果:
小明 岁 开着黑色 路虎在高速的行驶。。。
小明 岁 开着白色 公交车在缓慢的行驶。。。
6.原型模式
就是对对象的拷贝,深拷贝、浅拷贝生成新的对象。
7.适配器模式 (由源到目标的适配)
目标
public interface Robot
{
public void cry();
public void move();
}
源
public class Dog
{
public void shout()
{
System.out.println("狗可以汪汪叫!");
}
public void run()
{
System.out.println("狗可以跑!");
}
}
进行适配
public class DogAdapter extends Dog implements Robot
{
public void cry(){
System.out.print("机器人模仿:");
super.shout();
}
public void move(){
System.out.print("机器人模仿:");
super.run();
}
}
如果想要实现一个接口,但是又不想实现所有的接口,我们可以抽象出来一个方法,然后再去继承这个类,进行方法的复写,这也是适配模式
java 中设计模式的更多相关文章
- java中设计模式详解
一.设计模式的分类 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外 ...
- Java中设计模式之工厂模式-4
一.工厂模式由来 1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用. 2)简单工厂模式:后来出现工业革命.用户不用去创建宝马车.因为客户有 ...
- Java中设计模式之生产者消费者模式-4
引言 生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区.其中一个是生产者,用于将消息放入缓冲区:另 ...
- Java中设计模式之装饰者模式-3
装饰者模式: 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 装饰者核心:实现功能组合 继承与组合区别: 继承 继承是给一个类添加行为的比较有效的途径.通过使用继承, ...
- Java中设计模式之单例设计模式-1
单例作用 1 节省内存 2 可以避免多种状态导致状态冲突 单例的创建步骤 1 私有化构造方法 2 私有化声明的属性 3 getInstance 4 方法需要静态 单例分类 1.懒汉式 2.饿汉式 两种 ...
- java中的23中设计模式(转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)
Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...
- java开发中的23中设计模式详解--大话设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java中的23中设计模式(转载的,有时间一定要熟读)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- 【Data Structure & Algorithm】求1+2+…+n
求1+2+-+n 题目:求1+2+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A ? B : C). 分析:此题没多少实际意义,因为 ...
- Flutter实战视频-移动电商-26.列表页_使用Provide控制子类-2
26.列表页_使用Provide控制子类-2 主要实现功能,点击一级分类,二级分类跟着变.这里主要用哦我们的provide 新建provide provide文件夹下创建:child_category ...
- Flutter实战视频-移动电商-54.购物车_商品列表子项布局
54.购物车_商品列表子项布局 子项做成一个单独的页面 新建cartItem.dart文件 新建cart_page文件夹,在里面新建cart_item.dart页面, 页面名字叫做CartItem 定 ...
- Oracle中的集合运算
前言:在实际项目中对多表进行集合运算使用非常广泛,以下是对集合操作的部分总结. 一,建表,插入测试数据 create table a( numbers integer ) create table b ...
- Android开发实践:掌握Camera的预览方向和拍照方向
http://ticktick.blog.51cto.com/823160/1592267?utm_source=tuicool&utm_medium=referral Android的Cam ...
- unity sprite怎么获取切割后的图
学习了一段时间的unity,对里面的组件有一个大致的了解,但是具体操作来说还不是很熟悉,今天看了一片关于unity sprite怎么获取切割后的图的文章,感觉还不错. 假设有一张png/tga图集,导 ...
- 记一次因证书问题导致请求失败问题SSLHandshakeException
记一次因证书问题导致请求失败问题SSLHandshakeException 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10989813.html 最近接一外 ...
- 码云最火爆开源项目 TOP 50,你都用过哪些?
前 20 名预览 排名软件排名软件 1zheng11AOSuite 2JFinal12Spiderman 3t-io13AG-Admin 4guns14renren-security 5hutool1 ...
- python错误之RuntimeError: dictionary changed size during iteration
pythonn报错信息: C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/Ad ...
- C# 面向对象之继承后初始化顺序
使用继承之后当我们初始化一个子类时子类的初始化顺序为: (1)初始化类的实例字段 (2)调用基类的构造函数,如果没有指明基类则调用System.Object的构造函数; (3)调用子类的构造函数