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)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- secureCRT访问centOS中文系统乱码问题
第一种修改linux和crt的编码方式为utf-8 第二种修改linux和crt的编码为GB2312, 重要!!!crt字体要改成新宋体,同时字符集要改为GB2312 加上最后一项后,成功解决了中文乱 ...
- c/c++面试39-44之内存动态分配
39 指针的初始化(二叉树排序),其中引入了双向链表 #include <stdio.h> #include <stdlib.h> struct Tag_Node { stru ...
- TypeScript完全解读(26课时)_16.声明合并
ts编辑器会将名字相同的多个声明合并为一个声明,合并后的声明,同时拥有多个声明的特性 example文件夹下新建merging.ts文件 定义相同名字的接口, 定义变量类型是上面的接口.,光写一个na ...
- ThinkPHP3.2.3中,配置文件里配置项的读取
在ThinkPHP3.2.3的版本中,配置项的读取,有两种情况. 是在PHP文件或者在PHP代码中的读取方法为C函数,例如:C('配置项的名称'); 在HTML模板中的读取方法为,例如{$Think. ...
- java 关于getProperty()方法中反斜杠问题
问: 在配置文件a.properties中有一行path=C:\test在java中getProperty("path")后,java把\t认为是一个字符TAB.怎样才能取到正确的 ...
- 洛谷 - P1829 - Crash的数字表格 - 莫比乌斯反演
求: \(S(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\) 显然: \(S(n,m)=\sum\limits_{i=1}^{n}\ ...
- HDU4801【DFS】
参考:大牛博客 题意: 给你一个2阶魔方,给你24个数代表颜色,然后让你求在<=n次操作里面最多能搞出几面是一样的. 思路: 就是一个DFS嘛,就是怎么转搞出来: 上面: 22 23 4 0 ...
- 51nod 1456【强连通,缩点,并查集】
话说这道题的机遇是看到了http://blog.csdn.net/u010885899/article/details/50611895很有意思:然后就去补了这题 题意: 建最少的边使得给出的点相连. ...
- [原创]内网渗透专用SSH连接工具sshcmd/sshshell/ssh密码破解以及Kali开启SSH
目录 1.Kali开启SSH 2.SSH连接工具优缺点 3.渗透专用SSH连接工具 4.ssh执行cmd源码 5.批量SSH密码破解 6.相关工具下载 0x001 SSH配置 1.打开文件 etc/s ...
- dubbo-admin安装
1.下载dubbo-adminhttps://github.com/apache/incubator-dubbo/tree/dubbo-2.5.7 2.解压,进入到/home/zhanxuewei/D ...