热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JAVA中的几种设计模式及接口的定义和使用

一、模板设计模式**开闭原则(OCP):一个软件实体如类、模块和函数应该对外扩展开放、对修改关闭;开闭原则是java世界中最基础的设计原则**。概述模板方法模式是类的行为模式。准备

一、 模板设计模式
** 开闭原则(OCP):一个软件实体如类、模块和函数应该对外扩展开放、对修改关闭;
开闭原则是java世界中最基础的设计原则**。

概述
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。比如定义一个操作中的算法的骨架,将步骤延迟到子类中。模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤。
模式中的角色
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
实例
我们以网上购物(OnlineShopping)为例,假设要分为七步:1、浏览商品(browseGoods)2、选择商品(selectGoods)3、客服服务(callService)4、结算(comupterPrice)5、支付(orderPay)6、配送服务(sendService) 7、查看订单(showOrder)。不同的网购平台要做的事情肯定不一样,如下:JAVA中的几种设计模式及接口的定义和使用
代码如下:
abstract class OnlineShopping{
public final void browseGoods(){
System.out.println(“1、浏览商品”);
}
public final void selectGoods(){
System.out.println(“2、选择商品”);
}
public abstract void callService();
public final void computerPrice(){
System.out.println(“4、结算”);
}
public abstract void orderPay();
public abstract void sendService();
public final void showOrder(){
System.out.println(“7、查看订单”);
}
final void process(){
browseGoods();
selectGoods();
if(isCallService()){
callService();
}
computerPrice();
orderPay();
sendService();
showOrder();
}
public boolean isCallService(){ //钩子方法
return true;
}
}
class JD extends OnlineShopping{
@Override
public void callService() {
System.out.println(“3、你好,京东服务”);
}

@Override
public void orderPay() {
    System.out.println("5、微信支付");
}

@Override
public void sendService() {
    System.out.println("6、京东快递");
}

}
class Taobao extends OnlineShopping{
@Override
public void callService() {
System.out.println(“3、你好,淘宝客服”);
}

@Override
public void orderPay() {
    System.out.println("5、支付宝支付");
}

@Override
public void sendService() {
    System.out.println("6、圆通速递");
}

}
public class TestDemo{
public static void main(String[] args) {
JD jd = new JD();
jd.process();
System.out.println();
Taobao taobao = new Taobao();
taobao.process();
}
}
运行结果:JAVA中的几种设计模式及接口的定义和使用

二、接口的定义与使用
要点提示: 接口是一种与类相似的结构,只包含 全局常量抽象方法
接口在许多方面都与抽象类相似,但是它的目的是指明相关或者不相关类的多个对象的共同行为。例如,使用正确的接口,可以指明这些对象是可以比较的、可食用的、以及可克隆的。
在以后的开发过程中接口优先使用。
为了区分接口和类,java采用 interface 来定义接口:
JAVA中的几种设计模式及接口的定义和使用
下面是一个接口的例子:
public interface IMessage {
public static final String MSG= “I am a student”;//全局常量
public abstract void print();//抽象方法
}
接口的定义与使用的注意事项:
1、定义接口使用关键字 interface 接口名称使用 I 来表示;
2、接口定义的方法默认为抽象的(abstract);
3、接口内不能有已经实现的方法;
4、接口不能进行实例化;
5、接口可以继承多个接口,此时的接口拥有了继承的接口里面的抽象方法;
6、如果一个抽象类继承了接口,那么抽象类当中可以不实现接口的方法,但是如果再有一个普通类继承了此抽象类,那么普通类一定实现接口和接口类里面的抽象方法。
接口的应用:
public interface IMessage {
public static final String MSg = “I am a student”;//全局常量
public abstract void print();//抽象方法
}
interface INews{
public abstract String getNews();
}
class MessageImpl implements IMessage,INews{
@Override
public void print() {
System.out.println(IMessage.MSg);
}

@Override
public String getNews() {
    return IMessage.MSg;
}

}

public class TestDemo{
public static void main(String[] args) {
IMessage m = new MessageImpl();
m.print();
INews n = (INews)m;
System.out.println(n.getNews());
}
}

三、工厂设计模式
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类,简单来说工厂模式就是帮助我们来new对象的,为了避免直接对对象进行创建,而且把所有的对象都集中起来管理,也可以在不改动应用程序的基础上直接添加对象,便于对象的维护。
1.简单工厂模式,又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。
实例:
对于一个机器来说,它有一个共同的工作就是work,假设 RedMachine只能生产红色的球,BlueMachine只能生产蓝色的球。
代码如下:
JAVA中的几种设计模式及接口的定义和使用JAVA中的几种设计模式及接口的定义和使用JAVA中的几种设计模式及接口的定义和使用JAVA中的几种设计模式及接口的定义和使用
JAVA中的几种设计模式及接口的定义和使用
运行结果:
JAVA中的几种设计模式及接口的定义和使用
2、工厂方法
假如工厂还有其它的方法,比如维修。
JAVA中的几种设计模式及接口的定义和使用
JAVA中的几种设计模式及接口的定义和使用
3、 抽象工厂模式
工厂方法模式还是只能够制造制球机器,但是有可能生产汽车,生产食物,所以工厂的抽象类提供创建一系列的对象的接口。
//抽象工厂类
public interface AbstractFactory {
Car createVehicle();
Weapon createWeapon();
Food createFood();
}

//具体工厂类,其中Food,Vehicle,Weapon是抽象类,
public class DefaultFactory implements AbstractFactory{
@Override
public Food createFood() {
return new Apple();
}
@Override
public Vehicle createVehicle() {
return new Porsche();
}
@Override
public Weapon createWeapon() {
return new AK47();
}
}

四、代理设计模式
代理模式:两个子类共同完成一个接口的功能,其中一个子类负责真实的接口功能实现,另一个子类负责辅助真实功能
的完成。
目的:为其他对象提供一种代理以控制对这个对象的访问。
代理模式的本质:所有的真实业务操作都会有一个与之辅助的工具类(功能类)共同完成。

interface Subject{
void eat();
}

class RealSubject implements Subject{

@Override
public void eat() {
    System.out.println("eat food!");
}

}

class ProxySubject implements Subject{

private Subject sub;
public ProxySubject(Subject sub) {
    this.sub = sub;
}

public void preparation() {
    System.out.println("make food!");
}

public void postProcessing() {
    System.out.println("wash up!");
}

public void eat() {
    this.preparation();
    this.sub.eat();
    this.postProcessing();
}

}

class Factory{
public static Subject getInstance() {
return new ProxySubject(new RealSubject());
}
}
public class ProxyModeTest {
public static void main(String[] args) {
Subject sub = Factory.getInstance();
sub.eat();
}
}
输出结果:
make food!
eat food!
wash up!


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
author-avatar
涛声依旧0411_553
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有