精华内容
下载资源
问答
  • 那么你知道怎么将PPT转成PDF文件吗? 有些人是直接进行另存为的,我们打开一个PPT文件,点击左上角“文件”中的“另存为”。在另存为中,选择保存的文件格式为“PDF文件格式”即可。这个方法是简单,不过转换的效果...

    PPT是一种演示类文件,可是演示效果好却兼容性差。很多伙伴会选择将一些PPT转换成PDF文件用于传阅。那么你知道怎么将PPT转成PDF文件吗?
    在这里插入图片描述
    有些人是直接进行另存为的,我们打开一个PPT文件,点击左上角“文件”中的“另存为”。在另存为中,选择保存的文件格式为“PDF文件格式”即可。这个方法是简单,不过转换的效果是真的不理想。
    在这里插入图片描述
    那么想要转换文件质量好,你是需要使用专业转换工具的。这里小编给大家分享自己使用的【嗨格式PDF转换器】,这个工具支持多种转化模式且转换质量高。如果你需要把PPT转成PDF,你就打开嗨格式PDF转换器,点击主页中的“文件转PDF”功能。
    在这里插入图片描述

    进入到“文件转PDF”功能界面中,我们点击选择上面的“PPT转PDF”选项。再将PPT文件选择添加在PDF转换器中,点击软件中间,在弹出窗口中选择就可以添加文件。
    在这里插入图片描述

    文件添加之后,我们设置下需要的输出类型和输出目录,接着点击“开始转换”。嗨格式PDF转换器立即开始转换PPT文件,转换完成直接查阅PDF文件就行。这个方法是小编觉得最简单且转换效果做好的一个方法,大家可以试一下。
    在这里插入图片描述
    以后我们遇到PPT转PDF方面的问题,使用上面所说的方法就能够轻松解决。好方法不可错过,也希望它们能够给大家的工作带来帮助!

    展开全文
  • 其中对象的适配器模式是各种模式的起源,我们看下面的图:适配器模式(Adapter) 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的...

    7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图:

    d47103d0f03e8436cad6510bbf933186.png

    适配器模式(Adapter)

    适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。首先,我们来看看类的适配器模式,先看类图:

    e5dd0597fef8e584f73fe9025677beaa.png

    核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口时Targetable,通过Adapter类,将Source的功能扩展到Targetable里,看代码:

    7e2cedeb6744000ebacdacf31c3a691d.png

    784840c3a71acd1e010f3813f2bb36be.png

    2a6db1c2684e2581a3148409d68d27a6.png

    Adapter类继承Source类,实现Targetable接口,下面是测试类:

    175dd4e3adf04581e7729b7f2ff3830b.png

    输出:

    this is original method!
    this is the targetable method!

    这样Targetable接口的实现类就具有了Source类的功能。


    对象的适配器模式

    基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承Source类,而是持有Source类的实例,以达到解决兼容性的问题。看图:

    bf690184ee2722d2174559f41976e649.png

    只需要修改Adapter类的源码即可:

    5d38c393dfe1e021e53d4a73d399ec24.png

    测试类:

    19fee92fb1d6445fce86a911a0d14a9b.png

    输出与第一种一样,只是适配的方法不同而已。


    第三种适配器模式是接口的适配器模式,接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。看一下类图:

    89075c80837bea05d27097616dd8bbe2.png

    这个很好理解,在实际开发中,我们也常会遇到这种接口中定义了太多的方法,以致于有时我们在一些实现类中并不是都需要。看代码:

    c0cf37d088e96701dcc51eda9d12bea8.png

    抽象类Wrapper2:

    ad938179218889a8e8952acf2afac7c7.png

    85ab2ee64a0bb6e70643717ee49da40a.png

    62af7650472fa205f171edfaaa7bf517.png

    测试类:

    cd4add446792f137caf444481972b8ce.png

    测试输出:

    the sourceable interface's first Sub1!
    the sourceable interface's second Sub2!

    达到了我们的效果!

    讲了这么多,总结一下三种适配器模式的应用场景:

    类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

    对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

    接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。


    模式总结:

    优点:

    1.通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做 更简单、更直接、更紧凑。

    2.复用了现存的类,解决了现存类和复用环境要求不一致的问题。

    3.将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

    4.一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

    缺点:

    对于对象适配器来说,更换适配器的实现过程比较复杂。

    适用场景:

    1.系统需要使用现有的类,而这些类的接口不符合系统的接口。

    2. 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

    3.两个类所做的事情相同或相似,但是具有不同接口的时候。

    4. 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

    5. 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

    适配器应用举例

    1.使用过http://ADO.NET的开发人员应该都用过DataAdapter,它就是用作DataSet和数据源之间的适配器。DataAdapter通过映射Fill和Update来提供这一适配器。

    2.手机电源适配器等。

    展开全文
  • 这篇文章主要介绍了php设计模式中的适配器模式,使用php实现适配器模式,感兴趣的小伙伴们可以参考一下一、意图一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的那...

    这篇文章主要介绍了php设计模式中的适配器模式,使用php实现适配器模式,感兴趣的小伙伴们可以参考一下

    一、意图

    将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作

    二、适配器模式结构图

    c9e4da6c789ec7e76ac5956972420c94.png

    2a50467ecf944849893b61c0630207c1.png

    三、适配器模式中主要角色

    目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的

    源(Adaptee)角色:需要进行适配的接口

    适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类

    四、适配器模式适用场景1、你想使用一个已经存在的类,而它的接口不符合你的需求

    2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作

    3、你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口(仅限于对象适配器)

    五、类适配器模式与对象适配器类适配器:Adapter与Adaptee是继承关系

    1、用一个具体的Adapter类和Target进行匹配。结果是当我们想要一个匹配一个类以及所有它的子类时,类Adapter将不能胜任工作

    2、使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子集

    3、仅仅引入一个对象,并不需要额外的指针以间接取得adaptee

    对象适配器:Adapter与Adaptee是委托关系

    1、允许一个Adapter与多个Adaptee同时工作。Adapter也可以一次给所有的Adaptee添加功能

    2、使用重定义Adaptee的行为比较困难

    适配器模式与其它模式

    桥梁模式(bridge模式):桥梁模式与对象适配器类似,但是桥梁模式的出发点不同:桥梁模式目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而对象适配器模式则意味着改变一个已有对象的接口

    装饰器模式(decorator模式):装饰模式增强了其他对象的功能而同时又不改变它的接口。因此装饰模式对应用的透明性比适配器更好。

    六、类适配器模式PHP示例类适配器使用的是继承

    /**

    * 目标角色

    */

    interface Target {

    /**

    * 源类也有的方法1

    */

    public function sampleMethod1();

    /**

    * 源类没有的方法2

    */

    public function sampleMethod2();

    }

    /**

    * 源角色

    */

    class Adaptee {

    /**

    * 源类含有的方法

    */

    public function sampleMethod1() {

    echo 'Adaptee sampleMethod1
    ';

    }

    }

    /**

    * 类适配器角色

    */

    class Adapter extends Adaptee implements Target {

    /**

    * 源类中没有sampleMethod2方法,在此补充

    */

    public function sampleMethod2() {

    echo 'Adapter sampleMethod2
    ';

    }

    }

    class Client {

    /**

    * Main program.

    */

    public static function main() {

    $adapter = new Adapter();

    $adapter->sampleMethod1();

    $adapter->sampleMethod2();

    }

    }

    Client::main();

    ?>

    七、对象适配器模式PHP示例

    对象适配器使用的是委派

    /**

    * 目标角色

    */

    interface Target {

    /**

    * 源类也有的方法1

    */

    public function sampleMethod1();

    /**

    * 源类没有的方法2

    */

    public function sampleMethod2();

    }

    /**

    * 源角色

    */

    class Adaptee {

    /**

    * 源类含有的方法

    */

    public function sampleMethod1() {

    echo 'Adaptee sampleMethod1
    ';

    }

    }

    /**

    * 类适配器角色

    */

    class Adapter implements Target {

    private $_adaptee;

    public function __construct(Adaptee $adaptee) {

    $this->_adaptee = $adaptee;

    }

    /**

    * 委派调用Adaptee的sampleMethod1方法

    */

    public function sampleMethod1() {

    $this->_adaptee->sampleMethod1();

    }

    /**

    * 源类中没有sampleMethod2方法,在此补充

    */

    public function sampleMethod2() {

    echo 'Adapter sampleMethod2
    ';

    }

    }

    class Client {

    /**

    * Main program.

    */

    public static function main() {

    $adaptee = new Adaptee();

    $adapter = new Adapter($adaptee);

    $adapter->sampleMethod1();

    $adapter->sampleMethod2();

    }

    }

    Client::main();

    ?>

    以上就是使用php实现适配器模式的代码,还有一些关于适配器模式的概念区分,希望对大家的学习有所帮助。

    展开全文
  • 适配器模式(Adapter Pattern) 指一个类的接口转换成客户期望的另一个接口,使原本的接口不兼容的类可以一起工作。 属于结构型设计模式。 适用场景: 1.已经存在的类, ...

    适配器模式(Adapter Pattern)

    指将一个类的接口转换成客户期望的另一个接口,使原本的接口不兼容的类可以一起工作。

    属于结构型设计模式。

    适用场景:

    1.已经存在的类,它的方法和需求不匹配的情况。

    2.适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案。

    代码场景:

    现在需要给系统加上第三方登陆,要在保留原登陆接口不变的情况下加上。

    /**
     * @Author Darker
     * @Descrption
     * @Date : Created in 16:07 2020-3-12
     */
    @Data
    @AllArgsConstructor
    public class MsgResult {
    
        private int code;
        private Object data;
        private String msg;
    
        public static MsgResult success(Object data){
            return new MsgResult(200,data,"成功");
        }
    
        public static MsgResult fail(Object data){
            return new MsgResult(404,data,"失败");
        }
    }
    
    /**
     * @Author Darker
     * @Note 我心净处,何处不是西天。
     * @Descrption  相当于系统已经写好的代码,不去动它
     * @E-Mail : 1029149772@qq.com
     * @Date : Created in 13:38 2020-3-14
     */
    public class LoginService {
    
        //用户名,密码登陆方法
        public MsgResult login(String username,String password){
            return null;
        }
    
        //注册方法
        public MsgResult register(String username,String password){
            return login(username,password);
        }
    }
    
    /**
     * @Author Darker
     * @Note 我心净处,何处不是西天。
     * @Descrption 新的登陆接口
     * @E-Mail : 1029149772@qq.com
     * @Date : Created in 14:02 2020-3-14
     */
    public interface NewLogin {
    
        public MsgResult loginQQ(String id);
    
        public MsgResult loginWechat(String id);
    }
    
    /**
     * @Author Darker
     * @Note 我心净处,何处不是西天。
     * @Descrption 适配器方式
     * @E-Mail : 1029149772@qq.com
     * @Date : Created in 13:54 2020-3-14
     */
    public class LoginForThird extends LoginService implements NewLogin{
    
    
        @Override
        public MsgResult loginQQ(String id) {
            System.out.println("通过qq登陆");
            return null;
        }
    
        @Override
        public MsgResult loginWechat(String id) {
            System.out.println("通过微信登陆");
            return null;
        }
    }
    

    这就是一个最简单的适配器模式,当然也很像静态代理模式,因为设计模式是一种思想而不是局限于代码,只是用代码的方式来实现这种思想,当然,这样肯定是太简单了,那么我们现在来实现下业内比较流行的增加第三方登陆的方式。

    第一步:我们保留原系统login不变

    /**
     * @Author Darker
     * @Note 我心净处,何处不是西天。
     * @Descrption  相当于系统已经写好的代码,不去动它
     * @E-Mail : 1029149772@qq.com
     * @Date : Created in 13:38 2020-3-14
     */
    public class LoginService {
    
        //用户名,密码登陆方法
        public MsgResult login(String username,String password){
            System.out.println("用户pc登陆");
            return null;
        }
    
        //注册方法
        public MsgResult register(String username,String password){
            return login(username,password);
        }
    }
    

    第二步:我们加上一个适配器接口,和所有的适配器

    /**
     * @Author Darker
     * @Note 我心净处,何处不是西天。
     * @Descrption 在适配器中,这个接口可有可无,不要和模板模式混淆
     *              模板模式一定是抽象类,这里只是一个接口
     * @E-Mail : 1029149772@qq.com
     * @Date : Created in 14:38 2020-3-14
     */
    public interface LoginAdapter {
    
        //判断是否是需要调用的适配器,是否兼容
        /**
         * 为什么要这个方法,因为适配器可能会有多个,比如再来个注册适配器
         * @param adapter
         * @return
         */
        boolean support(Object adapter);
    
        public MsgResult login(String id,Object adapter);
    }
    /**
     * @Author Darker
     * @Note 我心净处,何处不是西天。
     * @Descrption
     * @E-Mail : 1029149772@qq.com
     * @Date : Created in 14:41 2020-3-14
     */
    public class LoginQQAdapter implements LoginAdapter{
        @Override
        public boolean support(Object adapter) {
            return adapter instanceof LoginQQAdapter;
        }
    
        @Override
        public MsgResult login(String id, Object adapter) {
            //写自己qq登陆的逻辑
            System.out.println("通过qq登陆");
            return null;
        }
    }
    
    /**
     * @Author Darker
     * @Note 我心净处,何处不是西天。
     * @Descrption
     * @E-Mail : 1029149772@qq.com
     * @Date : Created in 14:42 2020-3-14
     */
    public class LoginWechatAdapter implements LoginAdapter {
        @Override
        public boolean support(Object adapter) {
            return adapter instanceof LoginWechatAdapter;
        }
    
        @Override
        public MsgResult login(String id, Object adapter) {
            //写微信自己登陆的逻辑
            System.out.println("通过微信登陆");
            return null;
        }
    }
    
    
    /**
     * @Author Darker
     * @Note 我心净处,何处不是西天。
     * @Descrption
     * @E-Mail : 1029149772@qq.com
     * @Date : Created in 13:54 2020-3-14
     */
    public class LoginForThird extends LoginService implements NewLogin{
    
    
        //这里可以继续使用策略模式来优化
        @Override
        public MsgResult loginQQ(String id) {
            return loginAdapterFactory(id,LoginQQAdapter.class);
        }
    
        @Override
        public MsgResult loginWechat(String id) {
            return loginAdapterFactory(id,LoginWechatAdapter.class);
        }
    
        //简单工厂
        public MsgResult loginAdapterFactory(String id,Class <? extends LoginAdapter> clazz){
            try {
                LoginAdapter adapter = clazz.newInstance();
                if(adapter.support(adapter)){
                    return adapter.login(id,adapter);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return MsgResult.fail(null);
        }
    }
    
    /**
     * @Author Darker
     * @Note 我心净处,何处不是西天。
     * @Descrption
     * @E-Mail : 1029149772@qq.com
     * @Date : Created in 17:55 2020-3-13
     */
    public class AdapterTest {
        public static void main(String[] args) {
            LoginForThird loginForThird = new LoginForThird();
            loginForThird.login("xiaoming","123456");
            loginForThird.loginQQ("dsadas");
            loginForThird.loginWechat("1556");
        }
    }

    这样符合开闭原则,又用适配器解决了其它第三方登陆的需求,同时如果需要其它的登陆,也只需要继续增加适配器就可以了。

    看一下类图:

    我们来看看spring-aop中用到的策略模式:

     

     

    springAop中的消息通知中就使用了这个适配器模式 ,选择你要的适配器,然后看是在方法前通知还是方法后通知。

    再来看看spring-mvc中的适配器:

     

     

    这里的适配器主要是在servlet里面使用 ,有兴趣的小伙伴可以去DispatcherServlet中的doDispatch中看看。

    总结:

    优点:

    1.能提高类的透明性和复用,现有的类的复用不需要去做改变。

    2.目标类和适配器类的解耦。

    3.很多场景中符合开闭原则。

    缺点:

    1.需要全面考虑,而且很可能增加系统的复杂性。

    2.增加阅读代码的难度,过多使用可能使代码变的很乱。

    展开全文
  • PPT、Word、Excel等都是我们日常办公、学习中经常用到的工具。尤其是PPT,我们经常用于演示方案流程,它能自动播放成幻灯片模式,对于介绍大篇幅内容非常便利。...那么如何ppt转换成pdf呢?小编...
  • 模式的核心思想就是类中原本不适合当前客户端使用的接口转换成适用的接口,从而大大提高程序的兼容性。 并且从使用者的角度是看不到被适配的类地,也降低了代码之间的耦合性。 适配器模式的工作原理就是:用户...
  • 去年盛夏之时,曾写过“小tip: 使用CSS图片转换成黑白”一文,本文的模式以及内容其实走得是类似路线。CSS3 → SVG → IEfilter→canvas. 前段时间,iOS7不是瓜未熟就落地了嘛,然后捡瓜的人很多,然后国内外...
  • 继续上一篇 MonkeyLei:设计模式-Java-简单工厂模式--... 一个类的接口转换成客户希望的另外一个接口。 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 想使用一个已经存在的类,但如...
  • ​ 适配器模式简单来说,就是兼容的东西兼容。就相当于手机耳机的转换头。以前的手机都是有耳机孔的,但现在的没有了,那又怎么让以前的耳机可以用呢,这就用到了Type-C转换头,而这种就相当于适配器。 ​ ...
  • 1)适配器模式(Adapter Pattern)某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper) 2)适配器模式属于结构型模式 3)...
  • 今天说一下适配器模式一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间 感觉这是一个很好理解的模式,也是我们很常见的一个模式,比如我们连数据库的时候,用一个DataTable或...
  • 序言 在以前学习适配器模式时,有个经典例子:就是有些电器的工作电压不是220V, 比如电脑工作电压20V,但是...定义: 一个接口转换成客户所希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为为包装器...
  • 设计模式-适配器模式

    2017-03-02 00:25:52
    适配器模式对于Android开发的同志们再熟悉不过了,列表中经常会设计到adapter。但是如果你只知道怎么用,...适配器模式的定义:一个类的接口,转换为客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
  • 模式的核心思想就是类中原本不适合当前客户端使用的接口转换成适用的接口,从而大大提高程序的兼容性。并且从使用者的角度是看不到被适配的类地,也降低了代码之间的耦合性。适配器模式的工作原理就是:用户调用...
  • 一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式的本质是——转换匹配,复用功能。 怎么理解呢?就是说,新的接口需要实现的功能,...
  • 概述 在生活中如果两个不同语言的人怎么...适配器模式定义:适配器模式将一个类的接口,转换成客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作 Client:客户端 Target:目标...
  • 适配器模式

    2016-06-02 18:39:06
    今天说一下适配器模式一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间 感觉这是一个很好理解的模式,也是我们很常见的一个模式,比如我们连数据库的时候,用一个DataTable或...
  • 适配器模式(Adapter Pattern):一个接口转换成客户所希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象型结构模式《设计模式...
  • 适配器模式小试

    2019-06-29 13:47:45
    一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式的本质是——转换匹配,复用功能。 怎么理解呢?就是说,新的接口需要实现的功能,...
  • 适配器模式一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。 应用场景 假设已有一个软件系统,你希望它能和一个新的厂商类库搭配使用,但是这个新厂商所设计出来的接口...
  • 适配器模式就是某个类的接口转换为客户需要的那种接口,让因接口不匹配的类可以一起工作。也就是我们所说的兼容类适配器:画图理解如果没有这个适配器那么手机是不能直接使用的220v的电压的,所以我们就需要这个...
  • 适配器模式的目的就是原来两个不兼容接口的类可以适配在一起工作。举一个现实中的例子,笔记本电脑和投影仪的适配。现在有些笔记本(可能较多,没做统计不细究了)对外只开放USB、TypeC接口了,就对投影仪来说,就...

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

怎么将兼容模式转换