> 最后一次作业啦~ [作业下载](https://hodam.top/myfile/class/program_method/homework4.pdf) ## 1. Adapter 模式 先上代码: ```java import java.util.*; import java.lang.*; public interface MediaPlayer { public void play(String audioType, String fileName); } public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); } public class VlcPlayer implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: "+ fileName); } @Override public void playMp4(String fileName) { //无任何操作 } } public class Mp4Player implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { //无任何操作 } @Override public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: "+ fileName); } } class MediaAdapter implements MediaPlayer{ private AdvancedMediaPlayer advplayer; MediaAdapter(String type,String file){ if(type.equals("mp4")) advplayer= new Mp4Player(); else if(type.equals("vlc")) advplayer = new VlcPlayer(); } @java.lang.Override public void play(String audioType, String fileName) { if(audioType.equals("mp4")) advplayer.playMp4(fileName) else if(audioType.equals("vlc")) advplayer.playVlc(fileName); } } class AudioPlayer implements MediaPlayer{ private MediaAdapter adp; @java.lang.Override public void play(String audioType, String fileName) { if(audioType.euqals("mp3")){ System.out.println("now playing file:"+fileName); } else if(audioType.euqals("vlc")||audioType.euqals("mp4")){ adp=new MediaAdapter(audioType); adp.play(audioType,fileName); } else System.out.println("Invaild file type:"+audioType); } } public class AdapterPatternDemo { public static void main(String args[]){ AudioPlayer test = new AudioPlayer(); test.play("mp4","hello"); test.play("vlc","goodbye"); test.play("mkv","never say never"); } } ``` ### UML 图  ## 2. 解释 MVC 模式思想 MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。 Model 负责数据访问,较现代的 Framework 都会建议使用独立的数据对象(DTO, POCO, POJO 等)来替代弱类型的集合对象。数据访问的代码会使用 Data Access 的代码或是 ORM-based Framework,也可以进一步使用 Repository Pattern 与 Unit of Works Pattern 来切割数据源的相依性。 Controller 负责处理消息,较高端的 Framework 会有一个默认的实现来作为 Controller 的基础,例如 Spring 的 DispatcherServlet 或是 ASP.NET MVC 的 Controller 等,在职责分离原则的基础上,每个 Controller 负责的部分不同,因此会将各个 Controller 切割成不同的文件以利维护。 View 负责显示数据,这个部分多为前端应用,而 Controller 会有一个机制将处理的结果(可能是 Model, 集合或是状态等)交给 View,然后由 View 来决定怎么显示。例如 Spring Framework 使用 JSP 或相应技术,ASP.NET MVC 则使用 Razor 处理数据的显示。 ## 3. 优化程序方法 > 作为一个捶 ACM 的选手,日常遇到的最多的问题应该就是优化程序的时间复杂度,偶尔是空间复杂度。 主要有两个方面: ### a. 优化时间复杂度 具体一点来讲就是减少你的程序在执行过程中执行指令的次数。 通俗一点讲就是实现同样一个功能,你的代码计算的次数少,计算的速度快。 主要的方法有这些: #### (1) 降低算法的时间复杂度 比如说我们对一个无序的数组进行排序,小白可能会使用冒泡排序,但是这样的话,时间复杂度就是 $O(n^2)$,但是如果我们使用归并排序的话,复杂度就会稳定下降到 $O(n \times log(n))$。 #### (2) 优化常数级的复杂度 常数级别的优化这个也很好解释,比如说我们要计算 `a+b`,可以这么写: `a=a+b`,这里其实进行了两次操作,先计算 `a+b` 的值,再把计算出来的值赋值给 `a`。 而 `a+=b` 则省略了一步操作。 #### (3) 优化指令集(其他) 以 C++ 为例,比如你可能要计算某个数二进制上有多少个 1,你可能会这么写: ```cpp int count(int x) { int cnt=0; while(x) { cnt+=x&1; x>>=1; } return cnt; } ``` 但是在 GCC 的内置函数中就有专门计算这个东西的函数 `__builtin_popcount()`,而这个比起我们自己写函数也能够优化不少的时间。 还有一些其他的优化时间复杂度方法,比如说在 C++ 中关闭流同步加快输入输出,甚至自己建立一个读入的缓冲区……多的就不再详细举例了。 ### b. 优化空间复杂度 这里就不详细举例了,有时候我们在写动态规划算法的时候,就可以用滚动数组将 n*n 的数组节省到 n,这就是优化空间复杂度的一个实例。 Loading... > 最后一次作业啦~ [作业下载](https://hodam.top/myfile/class/program_method/homework4.pdf) ## 1. Adapter 模式 先上代码: ```java import java.util.*; import java.lang.*; public interface MediaPlayer { public void play(String audioType, String fileName); } public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); } public class VlcPlayer implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: "+ fileName); } @Override public void playMp4(String fileName) { //无任何操作 } } public class Mp4Player implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { //无任何操作 } @Override public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: "+ fileName); } } class MediaAdapter implements MediaPlayer{ private AdvancedMediaPlayer advplayer; MediaAdapter(String type,String file){ if(type.equals("mp4")) advplayer= new Mp4Player(); else if(type.equals("vlc")) advplayer = new VlcPlayer(); } @java.lang.Override public void play(String audioType, String fileName) { if(audioType.equals("mp4")) advplayer.playMp4(fileName) else if(audioType.equals("vlc")) advplayer.playVlc(fileName); } } class AudioPlayer implements MediaPlayer{ private MediaAdapter adp; @java.lang.Override public void play(String audioType, String fileName) { if(audioType.euqals("mp3")){ System.out.println("now playing file:"+fileName); } else if(audioType.euqals("vlc")||audioType.euqals("mp4")){ adp=new MediaAdapter(audioType); adp.play(audioType,fileName); } else System.out.println("Invaild file type:"+audioType); } } public class AdapterPatternDemo { public static void main(String args[]){ AudioPlayer test = new AudioPlayer(); test.play("mp4","hello"); test.play("vlc","goodbye"); test.play("mkv","never say never"); } } ``` ### UML 图  ## 2. 解释 MVC 模式思想 MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。 Model 负责数据访问,较现代的 Framework 都会建议使用独立的数据对象(DTO, POCO, POJO 等)来替代弱类型的集合对象。数据访问的代码会使用 Data Access 的代码或是 ORM-based Framework,也可以进一步使用 Repository Pattern 与 Unit of Works Pattern 来切割数据源的相依性。 Controller 负责处理消息,较高端的 Framework 会有一个默认的实现来作为 Controller 的基础,例如 Spring 的 DispatcherServlet 或是 ASP.NET MVC 的 Controller 等,在职责分离原则的基础上,每个 Controller 负责的部分不同,因此会将各个 Controller 切割成不同的文件以利维护。 View 负责显示数据,这个部分多为前端应用,而 Controller 会有一个机制将处理的结果(可能是 Model, 集合或是状态等)交给 View,然后由 View 来决定怎么显示。例如 Spring Framework 使用 JSP 或相应技术,ASP.NET MVC 则使用 Razor 处理数据的显示。 ## 3. 优化程序方法 > 作为一个捶 ACM 的选手,日常遇到的最多的问题应该就是优化程序的时间复杂度,偶尔是空间复杂度。 主要有两个方面: ### a. 优化时间复杂度 具体一点来讲就是减少你的程序在执行过程中执行指令的次数。 通俗一点讲就是实现同样一个功能,你的代码计算的次数少,计算的速度快。 主要的方法有这些: #### (1) 降低算法的时间复杂度 比如说我们对一个无序的数组进行排序,小白可能会使用冒泡排序,但是这样的话,时间复杂度就是 $O(n^2)$,但是如果我们使用归并排序的话,复杂度就会稳定下降到 $O(n \times log(n))$。 #### (2) 优化常数级的复杂度 常数级别的优化这个也很好解释,比如说我们要计算 `a+b`,可以这么写: `a=a+b`,这里其实进行了两次操作,先计算 `a+b` 的值,再把计算出来的值赋值给 `a`。 而 `a+=b` 则省略了一步操作。 #### (3) 优化指令集(其他) 以 C++ 为例,比如你可能要计算某个数二进制上有多少个 1,你可能会这么写: ```cpp int count(int x) { int cnt=0; while(x) { cnt+=x&1; x>>=1; } return cnt; } ``` 但是在 GCC 的内置函数中就有专门计算这个东西的函数 `__builtin_popcount()`,而这个比起我们自己写函数也能够优化不少的时间。 还有一些其他的优化时间复杂度方法,比如说在 C++ 中关闭流同步加快输入输出,甚至自己建立一个读入的缓冲区……多的就不再详细举例了。 ### b. 优化空间复杂度 这里就不详细举例了,有时候我们在写动态规划算法的时候,就可以用滚动数组将 n*n 的数组节省到 n,这就是优化空间复杂度的一个实例。 Last modification:April 26, 2019 © Allow specification reprint Support Appreciate the author Like 如果觉得我的文章对你有用,请随意赞赏